/ Hex Artifact Content
Login

Artifact d40cf1e890a0582b6ac7cb208c24619d72d2c900:


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 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72 61  ss */.  u8 extra
7530: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
7540: 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72 65      /* sync dire
7550: 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75 72  ctory after jour
7560: 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  nal delete */.  
7570: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7590: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75a0: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
75b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
75c0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
75e0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
75f0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
7600: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7610: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7620: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7630: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7640: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7650: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7670: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7680: 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61  porary or immuta
7690: 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ble file */.  u8
76a0: 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
76b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76c0: 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74  not lock (except
76d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f   in WAL mode) */
76e0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
7710: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
7720: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
7750: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
7760: 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a   */..  /********
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
77c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
77d0: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
77e0: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68   members that ch
77f0: 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  ange during.  **
7800: 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69   routine operati
7810: 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65  on.  Class membe
7820: 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62  rs not in this b
7830: 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72 20  lock are either 
7840: 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20  fixed.  ** when 
7850: 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69 72  the pager is fir
7860: 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c  st created or el
7870: 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77  se only change w
7880: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20  hen there is a. 
7890: 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20   ** significant 
78a0: 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75 63  mode change (suc
78b0: 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68  h as changing th
78c0: 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63  e page_size, loc
78d0: 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20  king_mode,.  ** 
78e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  or the journal_m
78f0: 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74  ode).  From anot
7900: 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65 20  her view, these 
7910: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7920: 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20  scribe.  ** the 
7930: 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20 70  "state" of the p
7940: 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65  ager, while othe
7950: 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  r class members 
7960: 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a  describe the.  *
7970: 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  * "configuration
7980: 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  " of the pager..
7990: 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65    */.  u8 eState
79a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74     /* Pager stat
79c0: 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c  e (OPEN, READER,
79d0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e   WRITER_LOCKED..
79e0: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
7a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
7a20: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
7a30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
7a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
7a50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
7a60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
7a70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
7a80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7aa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
7ab0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
7ac0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
7ad0: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7af0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
7b00: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
7b10: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7b20: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7b30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7b40: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7b50: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62  urnals */.  u8 b
7b60: 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20 20  UseFetch;       
7b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7b80: 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29 20  to use xFetch() 
7b90: 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53  */.  u8 hasHeldS
7ba0: 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20  haredLock;      
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73 68   /* True if a sh
7bc0: 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76  ared lock has ev
7bd0: 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a  er been held */.
7be0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7c10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7c20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7c30: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7c40: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7c50: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7c60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7c70: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7ca0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7cb0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7cc0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7cd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7ce0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7cf0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7d00: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7d30: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7d70: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7d80: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7d90: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7da0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7db0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7dc0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7dd0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7de0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7e10: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7e20: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7e30: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7e40: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7e50: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7e60: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7e70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7e90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7ea0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7eb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ed0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7ee0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ef0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7f00: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7f10: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7f20: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7f30: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7f40: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7f50: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7f60: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7f70: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7f80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7f90: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7fa0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7fb0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7fc0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7fd0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ff0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
8000: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
8010: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
8020: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
8030: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
8040: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
8050: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
8060: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
8070: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
8080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8090: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
80a0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
80b0: 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61  t[] */.  u32 iDa
80c0: 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20  taVersion;      
80d0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
80e0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
80f0: 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65  e content change
8100: 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  s */.  char dbFi
8110: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
8120: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
8130: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
8140: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
8150: 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b  .  int nMmapOut;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70  * Number of mmap
8180: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
8190: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a   outstanding */.
81a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
81b0: 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  szMmap;       /*
81c0: 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d   Desired maximum
81d0: 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20   mmap size */.  
81e0: 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65  PgHdr *pMmapFree
81f0: 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  list;       /* L
8200: 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70  ist of free mmap
8210: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70   page headers (p
8220: 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20  Dirty) */.  /*. 
8230: 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72   ** End of the r
8240: 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e  outinely-changin
8250: 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a  g class members.
8260: 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    **************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
82b0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82d0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
82e0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
82f0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
8300: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8320: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8330: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
8340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
8350: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8370: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
8380: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
8390: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
83a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
83b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
83c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
83d0: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61  back */.  int pa
83e0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
83f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8400: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
8410: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
8420: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8430: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
8440: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
8450: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
8460: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8470: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
8480: 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70  Size limit for p
8490: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
84a0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61  l files */.  cha
84b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
84c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
84d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
84e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
84f0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
8500: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8510: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
8520: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
8530: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
8540: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
8550: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
8560: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
8570: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
8580: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
8590: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
85a0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  Handler */.  int
85b0: 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20   aStat[3];      
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
85d0: 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69  l cache hits, mi
85e0: 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20  sses and writes 
85f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8600: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61  _TEST.  int nRea
8610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8620: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8630: 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65  pages read */.#e
8640: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
8650: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
8660: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
8670: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
8680: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
8690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
86a0: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
86b0: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
86c0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
86d0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
86e0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
86f0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
8700: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
8710: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
8720: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
8730: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
8740: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
8750: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
8760: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
8770: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
8780: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
8790: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
87a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
87b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
87c0: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
87d0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
87e0: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
87f0: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
8800: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
8810: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
8820: 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50   */.  PCache *pP
8830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
8840: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8850: 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63  page cache objec
8860: 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  t */.#ifndef SQL
8870: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57  ITE_OMIT_WAL.  W
8880: 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20  al *pWal;       
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
88a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73  ite-ahead log us
88b0: 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ed by "journal_m
88c0: 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68  ode=wal" */.  ch
88d0: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
88e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
88f0: 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65  e name for write
8900: 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65  -ahead log */.#e
8910: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
8920: 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77  ndexes for use w
8930: 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b  ith Pager.aStat[
8940: 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74  ]. The Pager.aSt
8950: 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  at[] array conta
8960: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
8970: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  s accessed by pa
8980: 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53  ssing SQLITE_DBS
8990: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
89a0: 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20   CACHE_MISS .** 
89b0: 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74  or CACHE_WRITE t
89c0: 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61  o sqlite3_db_sta
89d0: 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tus()..*/.#defin
89e0: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  e PAGER_STAT_HIT
89f0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
8a00: 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a  ER_STAT_MISS  1.
8a10: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a20: 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a  AT_WRITE 2../*.*
8a30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8a40: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8a50: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8a60: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8a70: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8a80: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a90: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8aa0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8ab0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8ac0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8ad0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8ae0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8af0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8b00: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8b10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8b20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8b30: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8b40: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8b50: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8b60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8b70: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8b80: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8b90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8ba0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8bb0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8bc0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8bd0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8be0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8bf0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8c00: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8c10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8c20: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8c40: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8c50: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8c60: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8c70: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8c80: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8c90: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8ca0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8cb0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8cc0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8ce0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8cf0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8d00: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8d10: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8d20: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8d40: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8d50: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8d60: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8d70: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8d80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8d90: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8da0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8db0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8dc0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8dd0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8de0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8df0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8e00: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8e10: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8e20: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8e30: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8e40: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8e50: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8e60: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8e70: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8e80: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8e90: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8ea0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8eb0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8ec0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8ed0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8ee0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8ef0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8f00: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8f10: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8f30: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8f40: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8f50: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8f60: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8f70: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8f80: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8f90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8fa0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8fb0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8fc0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8fd0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8fe0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8ff0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
9000: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
9010: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
9020: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
9030: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
9040: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
9050: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
9060: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
9070: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
9080: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
9090: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
90a0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
90b0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
90c0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
90d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
90e0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
90f0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
9100: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
9110: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
9120: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
9130: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
9140: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
9150: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
9160: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
9170: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
9180: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
9190: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
91a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
91b0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
91c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
91d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
91e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
91f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
9200: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9210: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
9220: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
9230: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
9240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9250: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
9260: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
9270: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
9280: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
9290: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
92a0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
92b0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
92c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
92d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
92e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
92f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
9300: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
9310: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
9320: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
9330: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9340: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
9350: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
9360: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
9370: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
9380: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
9390: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
93a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
93b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
93c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
93d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
93e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
93f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
9400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9410: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
9420: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
9430: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
9440: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
9450: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9460: 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20   macro USEFETCH 
9470: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9480: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65  e allowed to use
9490: 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20   the xFetch and 
94a0: 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65  xUnfetch.** inte
94b0: 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73  rfaces to access
94c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
94d0: 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  ing memory-mappe
94e0: 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51  d I/O..*/.#if SQ
94f0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
9500: 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53  ZE>0.# define US
9510: 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e  EFETCH(x) ((x)->
9520: 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65  bUseFetch).#else
9530: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9540: 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  CH(x) 0.#endif..
9550: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9560: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9570: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9580: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9590: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
95a0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
95b0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
95c0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
95d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
95e0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
95f0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
9600: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
9610: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
9620: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
9630: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
9640: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9650: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9660: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9670: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9680: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9690: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
96a0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
96b0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
96c0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
96d0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
96e0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
96f0: 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52  ods!=0)../*.** R
9700: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9710: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9720: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9730: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9740: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9750: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9760: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9780: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9790: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
97a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
97b0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
97c0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
97d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
97e0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
97f0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9800: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9810: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9820: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9830: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9840: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9850: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9860: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9870: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9880: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9890: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
98a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
98b0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
98c0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
98d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
98e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
98f0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9900: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9910: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9920: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9930: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9940: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9960: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9970: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9980: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9990: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
99a0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
99b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
99c0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
99f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a10: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9a40: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a60: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9a70: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a80: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9a90: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9aa0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ab0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9ac0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9ad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9ae0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9af0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9b00: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9b10: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9b20: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9b40: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9b50: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9b60: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9b70: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9b80: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9b90: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9ba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9bb0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9bd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9be0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9bf0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9c00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9c10: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9c20: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9c30: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9c40: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9c50: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9c60: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9c70: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9c80: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9c90: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9ca0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9cb0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9cc0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9cd0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9ce0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9d30: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9d40: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9d50: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9d60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9d70: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9d80: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9da0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9db0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9dc0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9dd0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9de0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9df0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9e00: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9e10: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9e30: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9e40: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9e50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9e60: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9e70: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9e80: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9e90: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9ea0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9eb0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9ec0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9ed0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9ee0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9ef0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9f00: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9f10: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9f20: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f60: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9f70: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9f80: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9f90: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fb0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9fc0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9fd0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ff0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
a000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
a010: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
a020: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
a030: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
a040: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
a050: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
a060: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
a070: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
a080: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
a090: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
a0a0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
a0b0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a0c0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a0d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
a0e0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
a0f0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
a110: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a150: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a160: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a170: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
a180: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
a190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1a0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
a1b0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
a1c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a1d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a1e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1f0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a200: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
a230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a240: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a250: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
a260: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a270: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a280: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a290: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a2a0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
a2c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a2d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a2e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a2f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a300: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a320: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a330: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a340: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a350: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a360: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a370: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a380: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a390: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a3a0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a3b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3c0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a3f0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a400: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a410: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a420: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a440: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a450: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a460: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a480: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a490: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a4a0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a4b0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a4c0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a4d0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a4e0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a500: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a510: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a520: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a530: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a540: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a550: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a560: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a580: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a590: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a5a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a5d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a5e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a5f0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a600: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a610: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a620: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a650: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a660: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a670: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a680: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a690: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a6a0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a6b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a6c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a6d0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a700: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a710: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a720: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a740: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a750: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a760: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a790: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a7a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a7b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a7c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a7d0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a7e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a7f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a800: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a820: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a830: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a840: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a850: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a860: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a870: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a880: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a890: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a8a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a8e0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a8f0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a900: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a910: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a920: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a930: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a940: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a950: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a960: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a970: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a980: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a9b0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a9c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a9d0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a9e0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a9f0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
aa00: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
aa10: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
aa20: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
aa30: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
aa40: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
aa50: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
aa60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
aa70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
aa80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
aa90: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
aaa0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
aab0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
aac0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
aad0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aae0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
aaf0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab00: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab10: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab30: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab40: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab50: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab60: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab70: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab80: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
ab90: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
aba0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abb0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abc0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abd0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abe0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
abf0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac00: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac10: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac20: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac30: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac40: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac50: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac60: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac70: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac80: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
ac90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
aca0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acb0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
acd0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
ace0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
acf0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad00: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad10: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad30: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad40: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad50: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad60: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad70: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad80: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ad90: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
ada0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adb0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
adc0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
add0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
ade0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
adf0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae00: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae10: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae20: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae40: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae50: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae60: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae70: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae80: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ae90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aea0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aeb0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aec0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aed0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aee0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
aef0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af00: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af10: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af20: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af30: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af40: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af60: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af70: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af80: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af90: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afa0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afb0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afc0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afd0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
afe0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aff0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b000: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b010: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b020: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b030: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b040: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b050: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b060: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b070: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b080: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b090: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0a0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0c0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0d0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0e0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b0f0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b100: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b120: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b130: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b140: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b150: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b160: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b170: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b180: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b190: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1b0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1c0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1f0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b200: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b210: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b220: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b230: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b240: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b250: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b270: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b280: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b290: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2a0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2b0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2c0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2d0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2e0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b2f0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b300: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b310: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b320: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b330: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b340: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b360: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b370: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b380: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b3a0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b3b0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b3c0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b3d0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b3e0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b3f0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b400: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b410: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b420: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b430: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b440: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b450: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b460: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b470: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b480: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b490: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b4a0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b4b0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b4d0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b4e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b4f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b500: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b510: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b520: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b530: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b540: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b550: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b560: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b570: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b580: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b590: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b5a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b5b0: 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53  tNotNull(p->pInS
b5c0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
b5d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b5e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b5f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b620: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b630: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b650: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b660: 49 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  InJournal(Pager 
b670: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
b680: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
b690: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
b6a0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
b6b0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
b6c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b6d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
b6e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b6f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b7a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b7b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b7c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b7d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7f0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b800: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b810: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b820: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b830: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b840: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b860: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b870: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b880: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b890: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b8a0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b8b0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b8c0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b8d0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b8e0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b8f0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b900: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b910: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b920: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b930: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b940: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b950: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b960: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b970: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b980: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b990: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b9a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b9b0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b9c0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b9d0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b9e0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b9f0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
ba00: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
ba10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ba20: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
ba30: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
ba40: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ba50: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
ba60: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
ba70: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ba80: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
ba90: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
baa0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
bab0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
bac0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
bad0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
bae0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
baf0: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
bb00: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
bb10: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
bb20: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bb30: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
bb60: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bb70: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
bb80: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bb90: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bba0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
bbb0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bbc0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
bbd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bbe0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
bbf0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
bc00: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
bc10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
bc20: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
bc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
bc40: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bc50: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
bc60: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
bc70: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
bc80: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
bc90: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
bca0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
bcb0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
bcc0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
bcd0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
bce0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bcf0: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
bd00: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
bd10: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
bd20: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bd30: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
bd40: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
bd50: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
bd60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
bd70: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bd80: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
bda0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
bdb0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bdc0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
bdd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bde0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
bdf0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
be00: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
be10: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
be20: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
be40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
be50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
be60: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
be70: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
be80: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
be90: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bea0: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
beb0: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bec0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bed0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bee0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bef0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
bf00: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
bf10: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
bf20: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
bf30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
bf40: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
bf50: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bf60: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
bf70: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
bf80: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
bf90: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bfa0: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
bfb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bfc0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
bfd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
bfe0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
bff0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c000: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
c010: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
c020: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
c030: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c040: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
c050: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
c060: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c070: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
c080: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
c090: 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   : sqlite3OsLock
c0a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c0b0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
c0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
c0d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
c0e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
c0f0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c100: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
c110: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c120: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
c130: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
c140: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c150: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
c160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c180: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
c190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c1a0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
c1b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
c1c0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
c1d0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
c1e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c1f0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
c200: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
c210: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c220: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c230: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
c240: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
c250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c260: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
c270: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
c280: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
c290: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
c2a0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
c2b0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
c2c0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
c2d0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
c2e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
c2f0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
c300: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
c310: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
c320: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
c330: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
c340: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
c350: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
c360: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
c370: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
c380: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
c390: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
c3a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
c3b0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
c3c0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
c3d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c3e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c400: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
c410: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
c420: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
c430: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
c440: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
c450: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
c460: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
c470: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
c480: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
c490: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
c4a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c4b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c4e0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c4f0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
c500: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c520: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
c530: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
c560: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
c570: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c580: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
c590: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
c5a0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
c5b0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
c5c0: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
c5d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
c5e0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
c5f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
c600: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c610: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
c620: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
c630: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c640: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
c650: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
c660: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
c670: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c680: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
c690: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
c6c0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
c6d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
c6e0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c6f0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
c700: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
c710: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
c720: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
c730: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
c740: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
c750: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
c760: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
c770: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
c780: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
c790: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c7b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
c7c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
c7d0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
c7e0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
c7f0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
c800: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
c810: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
c820: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c830: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c840: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c860: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c870: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c880: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c890: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c8a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c8b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c8c0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c8d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8e0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c8f0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c900: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c910: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c920: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c930: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c940: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c950: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c960: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c970: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c980: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c990: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c9a0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c9b0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c9c0: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c9d0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c9e0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c9f0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
ca00: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
ca10: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ca20: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
ca30: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
ca40: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
ca50: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
ca60: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
ca70: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
ca80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ca90: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
caa0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cab0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cad0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
cae0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
caf0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
cb00: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
cb10: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
cb20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cb30: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
cb40: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
cb50: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cb60: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
cb70: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cb80: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
cb90: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cba0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cbb0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cbc0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cbe0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cbf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
cc00: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
cc10: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cc30: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
cc40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cc50: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cc60: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cc70: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cc80: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cc90: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cca0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
ccb0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
ccc0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
ccd0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
cce0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
ccf0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
cd00: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
cd20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
cd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
cd40: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
cd50: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
cd60: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
cd70: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
cd80: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
cd90: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
cda0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
cdb0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
cdc0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
cdd0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
cde0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
cdf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce00: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
ce10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ce20: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
ce30: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
ce40: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
ce50: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
ce60: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
ce70: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
ce80: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
ce90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cea0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
ceb0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
cec0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
ced0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cee0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cef0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
cf00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
cf10: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
cf20: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
cf30: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
cf40: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
cf50: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cf60: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
cf70: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
cf80: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
cf90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
cfa0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
cfb0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
cfc0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
cfd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cfe0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cff0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d000: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d010: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d020: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d030: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d040: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d050: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d060: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d080: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d090: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d0a0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d0b0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d0c0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d0d0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d0e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d0f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d100: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d110: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d120: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d130: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d150: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d180: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d190: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d1a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1c0: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d1d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d1e0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d210: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d220: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d230: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d240: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d250: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d260: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d270: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d280: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d290: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d2a0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d2b0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d2c0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d2d0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d2e0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d2f0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d300: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d310: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d320: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d330: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d340: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d350: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d360: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d370: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d380: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d390: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d3a0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d3b0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d3c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d3d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d3e0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d3f0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d400: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d410: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d420: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d430: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d450: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d460: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d470: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d480: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d490: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d4a0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d4b0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d4c0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d4d0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d4e0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d4f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d500: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d510: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d520: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d530: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d540: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d550: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d560: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d570: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d580: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d590: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d5a0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d5b0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d5c0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d5f0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d600: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d610: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d620: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d630: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d650: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d660: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d670: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d680: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d690: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d6a0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d6b0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d6c0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d6d0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d730: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d740: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d750: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d760: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d770: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d790: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d7a0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d7b0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d7c0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d7d0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d7e0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d7f0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d800: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d810: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d820: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d830: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d860: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d870: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d880: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d8a0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d8b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d8c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d8d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d8f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d900: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d910: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d930: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d950: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d960: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d970: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d980: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d990: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d9a0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d9b0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d9c0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d9d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d9e0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d9f0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
da00: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
da20: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
da30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
da40: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
da50: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
da60: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
da70: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
da80: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
da90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
daa0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
dab0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
dac0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
dad0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
dae0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
daf0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
db00: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
db10: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
db20: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
db30: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
db40: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
db50: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
db60: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
db70: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
db80: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
db90: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dba0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
dbb0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
dbc0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
dbd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
dbe0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
dbf0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
dc00: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
dc10: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
dc20: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
dc30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dc40: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
dc50: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dc60: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dc70: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dc80: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dc90: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dca0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dcb0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
dcc0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
dcd0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
dce0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
dcf0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
dd00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
dd40: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
dd50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
dd60: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a  ssert( !sqlite3J
dd70: 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
dd80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
dd90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
dda0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
ddb0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
ddc0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
ddd0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
dde0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
ddf0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
de00: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
de10: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
de20: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
de30: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
de40: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
de50: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
de60: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
de90: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
dea0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
deb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
dec0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ded0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
dee0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
def0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
df00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
df10: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
df20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df30: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
df40: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
df50: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
df60: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
df70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
df80: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
dfa0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
dfb0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
dfc0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
dfd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
dfe0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
dff0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
e000: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
e010: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
e020: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
e030: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
e040: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
e050: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
e060: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
e070: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
e080: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
e090: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
e0a0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
e0b0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
e0c0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
e0d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
e0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e0f0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
e100: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
e110: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e120: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
e130: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
e140: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e150: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
e160: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e170: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e180: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
e190: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
e1a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e1b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
e1c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
e1d0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
e1e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e1f0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
e200: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
e210: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
e220: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
e230: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
e240: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
e250: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
e260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
e270: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
e280: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
e290: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
e2a0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
e2b0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
e2c0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
e2d0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
e2e0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
e2f0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
e300: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
e310: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
e320: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
e330: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
e340: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
e350: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
e360: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
e370: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
e380: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
e390: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
e3a0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
e3b0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
e3c0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
e3d0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
e3e0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
e3f0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
e400: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e420: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
e430: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e450: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e460: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e470: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
e480: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
e490: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
e4a0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
e4b0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
e4c0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e4d0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
e4e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
e4f0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e500: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e510: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
e520: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
e550: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
e560: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e590: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e5a0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e5b0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
e5c0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
e5d0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e5e0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
e5f0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e600: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e610: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e630: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e640: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e650: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e660: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e670: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e680: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e690: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e6a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e6b0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e6c0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e6d0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e6e0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e6f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e700: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e710: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e720: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e730: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e740: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e750: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e760: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e770: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e780: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e790: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e7a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e7b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e7c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e7d0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e7e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e7f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e800: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e810: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e820: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e830: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e840: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e850: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e860: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e870: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e880: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e890: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e8a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e8b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e8c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e8d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e8e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e8f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e900: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e910: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e920: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e930: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e940: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e950: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e960: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e970: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e980: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e990: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e9a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e9b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e9c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e9d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e9e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e9f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
ea00: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
ea10: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
ea20: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
ea30: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
ea40: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
ea50: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
ea60: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
ea70: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
ea80: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
ea90: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
eaa0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
eab0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
eac0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
ead0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
eae0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
eaf0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
eb00: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
eb10: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
eb20: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
eb30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
eb40: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
eb50: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
eb60: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
eb70: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
eb80: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
eb90: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
eba0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
ebb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
ebc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
ebd0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
ebe0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
ebf0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
ec00: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
ec10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ec20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ec30: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
ec40: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ec50: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ec60: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
ec70: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
ec80: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
ec90: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
eca0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
ecb0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ecc0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
ecd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
ece0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ecf0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
ed00: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
ed10: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
ed20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
ed30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
ed40: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
ed50: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
ed60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
ed70: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
ed80: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
ed90: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
eda0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
edb0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
edc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
edd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ede0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
edf0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
ee00: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
ee10: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ee20: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ee30: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ee40: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
ee50: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
ee60: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
ee70: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
ee80: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
ee90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eea0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eeb0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
eec0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
eed0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
eee0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
eef0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ef00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ef10: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
ef20: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
ef30: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
ef40: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
ef50: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
ef60: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
ef70: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
ef80: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
ef90: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
efa0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
efb0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
efc0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
efd0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
efe0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
eff0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
f000: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
f010: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
f020: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
f030: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
f040: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f050: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
f060: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
f070: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f080: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
f090: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
f0a0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
f0b0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
f0c0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
f0d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
f0e0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
f0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f100: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
f110: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
f120: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f130: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
f140: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
f150: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
f160: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
f170: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
f180: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
f190: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
f1a0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
f1b0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
f1c0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
f1d0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
f1e0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
f1f0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
f200: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
f210: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
f220: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
f230: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
f240: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
f250: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
f260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
f270: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
f280: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
f290: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
f2a0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
f2b0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
f2c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
f2d0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
f2e0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
f2f0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
f300: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
f310: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
f320: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
f330: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
f340: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
f350: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
f360: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
f370: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
f380: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
f390: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
f3a0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
f3b0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
f3c0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
f3d0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
f3e0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
f3f0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
f400: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
f410: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
f420: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
f430: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
f440: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
f450: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f460: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
f470: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
f480: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
f490: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
f4a0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f4b0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
f4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
f4e0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
f4f0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
f500: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
f510: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f520: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
f530: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f540: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f550: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
f560: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
f570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f580: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
f590: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
f5a0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
f5b0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
f5c0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
f5f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f600: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f610: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f620: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f630: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f640: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f650: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f660: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f670: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f680: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f690: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f6a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f6b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f6c0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f6d0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f6e0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f6f0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f700: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f710: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f720: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f730: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f740: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f750: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f760: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f770: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f780: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f790: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f7a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f7b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f7c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f7d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f7e0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f7f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f800: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f810: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f820: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f830: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f840: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f850: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f860: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f870: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f880: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f890: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f8a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f8b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f8c0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8f0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f900: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f920: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f930: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f940: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f960: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f970: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f980: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f990: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f9b0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f9c0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f9d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f9e0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f9f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
fa00: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
fa10: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
fa20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fa50: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
fa60: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
fa70: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
fa80: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
fa90: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
faa0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fac0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
fad0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
fae0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
faf0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
fb00: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
fb10: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
fb20: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
fb30: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
fb40: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
fb50: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fb60: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
fb70: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
fb80: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
fb90: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
fba0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
fbb0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
fbc0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
fbd0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
fbe0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
fbf0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
fc00: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
fc10: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
fc20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
fc30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fc40: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
fc50: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
fc60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
fc70: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
fc80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
fc90: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
fca0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
fcb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcc0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
fcd0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
fce0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
fcf0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
fd00: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
fd10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
fd20: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
fd30: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
fd40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
fd50: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fd60: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
fd70: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
fd80: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
fd90: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
fda0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
fdb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fdc0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
fdd0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
fde0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
fdf0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
fe00: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fe10: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
fe20: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
fe30: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
fe40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fe50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
fe60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fe70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fe80: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
fe90: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
fea0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
feb0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
fec0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
fed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
fee0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
fef0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
ff00: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
ff10: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
ff20: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
ff30: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
ff40: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
ff50: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
ff60: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff70: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff80: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
ff90: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
ffa0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffb0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffc0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffd0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
ffe0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
fff0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10000 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10010 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10020 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
10030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10040 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
10050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10060 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
10070 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
10080 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
10090 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
100a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
100b0 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
100c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
100d0 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
100e0 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
100f0 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
10100 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
10110 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10120 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
10130 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
10140 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
10150 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10160 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10170 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
10180 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
10190 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
101a0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
101b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
101c0 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
101d0 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
101e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
101f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
10200 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
10210 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
10220 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
10230 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
10240 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
10250 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
10260 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
10270 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
10280 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
10290 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
102a0 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
102b0 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
102c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
102d0 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
102e0 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
102f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
10300 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
10310 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
10320 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
10330 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
10340 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10350 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
10360 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
10370 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
10380 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
10390 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
103a0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
103b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
103c0 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
103d0 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
103e0 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
103f0 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
10400 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
10410 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
10420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10430 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10450 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
10460 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
10470 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
10480 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
10490 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
104a0 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
104b0 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
104c0 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
104d0 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
104e0 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
104f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
10500 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
10510 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
10520 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
10530 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10540 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
10550 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
10560 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
10570 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
10580 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
10590 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
105a0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
105b0 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
105c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
105d0 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
105e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
105f0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10600 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10610 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10630 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10640 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10650 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10660 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10670 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10680 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10690 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
106a0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
106b0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
106c0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
106d0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
106e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
106f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10700 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10710 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10720 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10730 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10740 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10750 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10760 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10770 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10780 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10790 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
107a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
107b0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
107c0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
107d0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
107e0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
107f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10800 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10810 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10820 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10830 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10840 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10850 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10860 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10870 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10880 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10890 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
108a0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
108b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
108c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
108d0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
108e0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
108f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10900 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10910 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10920 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10940 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10950 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10960 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10970 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10980 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10990 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
109a0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
109b0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
109c0 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
109d0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
109e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
109f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10a00 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10a10 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10a20 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10a30 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10a40 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10a50 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10a60 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10a70 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10a80 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10a90 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10aa0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10ab0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10ac0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10ad0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10ae0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10af0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10b00 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10b10 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10b20 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10b30 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10b40 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10b50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10b60 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10b70 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10b80 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10b90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10ba0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10bb0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10bc0 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10bd0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10be0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10bf0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10c00 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10c10 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10c20 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10c30 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10c40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10c50 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10c60 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10c70 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10c80 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10c90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10cc0 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10cf0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10d00 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10d30 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10d40 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10d50 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10d80 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10d90 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10db0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10dc0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10dd0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10de0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10df0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10e00 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10e10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10e20 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10e50 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10e60 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50     || !isOpen(pP
10e70 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a  ager->jfd).  ){.
10e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10ea0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10eb0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  1;.  assert( pPa
10ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10ed0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10ee0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10ef0 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10f00 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10f10 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10f20 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10f30 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10f40 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10f50 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10f60 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10f70 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10f80 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10f90 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10fa0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10fb0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10fc0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10fd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10fe0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10ff0 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
11000 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
11010 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
11020 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
11030 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
11040 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11050 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
11060 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11070 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
11080 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
11090 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
110a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110b0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
110c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
110d0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
110e0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
110f0 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
11100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11110 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
11120 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
11130 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
11140 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11150 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
11160 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
11170 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
11180 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
11190 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
111a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
111b0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
111c0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
111d0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
111e0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
111f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11200 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11210 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
11220 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11230 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11240 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11250 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
11260 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
11270 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11280 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11290 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
112a0 69 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20  ic, 8,.         
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b          iHdrOff+
112d0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
112e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
112f0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
11300 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
11310 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
11320 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11330 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
11340 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
11350 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
11360 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
11370 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
11380 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
11390 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
113a0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
113b0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
113c0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
113d0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
113e0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
113f0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
11400 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
11410 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11420 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
11430 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
11440 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
11450 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
11460 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11470 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11480 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
11490 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
114a0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
114b0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
114c0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
114d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
114e0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
114f0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
11500 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
11510 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11520 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11530 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11540 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11550 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11560 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11580 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11590 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
115a0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
115b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
115c0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
115d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
115e0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
115f0 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11610 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
11620 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
11630 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
11640 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  +;.  sqlite3Back
11650 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
11660 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
11670 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
11680 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11690 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
116a0 72 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69  rn the pPager->i
116b0 44 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75  DataVersion valu
116c0 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  e.*/.u32 sqlite3
116d0 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
116e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
116f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11700 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
11710 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e  OPEN );.  return
11720 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11730 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11740 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11750 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11760 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11770 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11780 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11790 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
117a0 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
117b0 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
117c0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
117d0 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
117e0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
117f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11810 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11820 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11830 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11850 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
11860 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11870 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11880 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11890 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
118a0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
118b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
118c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
118d0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
118e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
118f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11900 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
11910 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
11920 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
11930 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11940 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11950 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11970 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11980 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11990 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
119a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
119b0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
119c0 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
119d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
119e0 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
119f0 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11a00 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11a10 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11a20 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11a30 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11a40 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11a50 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11a60 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11a70 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11a80 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11a90 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11aa0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11ab0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11ac0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ae0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11af0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11b00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11b10 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11b20 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11b30 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11b40 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11b50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11b60 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11b70 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11b80 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11b90 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11ba0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11bb0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11bc0 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11bd0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11c10 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11c50 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11c60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11c70 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11c80 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11c90 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11ca0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11cb0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11cc0 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11cd0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11ce0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11cf0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11d00 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11d10 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11d20 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11d30 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11d40 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11d50 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11d60 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11d70 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11d80 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11d90 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11da0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11db0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11dc0 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11dd0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11de0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11df0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11e00 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11e10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11e20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11e30 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11e40 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11e50 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11e60 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11e70 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11e90 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11ea0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11ec0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11ed0 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11ee0 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11ef0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11f00 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11f10 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11f20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11f30 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11f40 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11f50 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11f60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11f70 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11f80 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11f90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11fa0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11fb0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11fc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11fd0 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11fe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ff0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12000 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
12010 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
12020 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
12030 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
12040 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
12050 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
12060 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12070 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12080 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12090 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
120a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
120b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
120c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
120d0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
120e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
120f0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12100 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
12110 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12120 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
12150 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
12160 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12170 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12190 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
121a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
121b0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
121c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
121d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
121e0 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
121f0 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12200 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
12210 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
12220 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
12230 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
12240 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
12250 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
12260 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12270 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12280 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12290 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
122a0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
122b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
122c0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
122d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
122e0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
122f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12300 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12310 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12320 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12330 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12340 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12360 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12370 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12380 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12390 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
123a0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
123b0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
123c0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
123d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
123e0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
123f0 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12400 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12410 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12420 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12440 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12450 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12460 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12480 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12490 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
124a0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
124b0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
124c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
124d0 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
124e0 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
124f0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12500 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12510 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12520 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12530 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12540 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12550 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
12560 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12570 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12580 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12590 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
125a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
125b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
125c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
125d0 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
125e0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
125f0 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12600 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12610 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12620 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12630 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12640 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12650 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
12660 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12670 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12680 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12690 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
126a0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
126b0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
126c0 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
126d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
126e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
126f0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12700 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12710 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12720 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12730 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12740 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12750 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12760 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12770 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12780 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12790 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
127a0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
127b0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
127c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
127d0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
127e0 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
127f0 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12800 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12810 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12820 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12830 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12840 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12850 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12860 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12870 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12880 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12890 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
128a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
128b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
128c0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
128d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
128e0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
128f0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12900 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12920 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12930 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12940 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12950 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12960 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12970 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12990 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
129a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
129b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
129c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
129d0 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
129e0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
129f0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12a00 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12a10 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12a20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12a30 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12a40 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12a50 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12a60 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12a70 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12a80 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12a90 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12aa0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12ab0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12ac0 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12ad0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12ae0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12af0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12b20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12b30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12b40 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12b50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12b60 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12b70 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12b80 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12b90 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12ba0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12bb0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12bc0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12bd0 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12be0 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12bf0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12c00 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12c10 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12c20 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12c30 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12c40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12c50 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12c60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12c70 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12c80 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12c90 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12ca0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12cb0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12cc0 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12cd0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12ce0 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12d00 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12d10 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12d20 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12d30 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12d40 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12d50 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12d60 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12d70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12d90 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12da0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12dc0 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12dd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12de0 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12df0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12e00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12e10 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12e20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12e50 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12e60 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12e70 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12e80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12e90 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12ea0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12eb0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12ec0 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12ed0 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12ee0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12ef0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12f00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12f10 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12f20 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12f30 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12f40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12f50 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12f60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12f70 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12f80 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12f90 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12fa0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12fb0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12fc0 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12fd0 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12fe0 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12ff0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13000 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13010 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13020 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13030 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13050 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13060 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13070 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13080 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13090 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
130a0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
130b0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
130c0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
130d0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
130e0 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
130f0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13100 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13110 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13120 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13130 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13140 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13150 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13160 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13170 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13180 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
131a0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
131b0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
131c0 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
131d0 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
131e0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
131f0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13200 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13210 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13220 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13230 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13240 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13250 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13260 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13270 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13280 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13290 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
132a0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
132b0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
132c0 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
132d0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132e0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
132f0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13300 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13310 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13320 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13330 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13340 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13350 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13360 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13370 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13380 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13390 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
133a0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
133b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
133c0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
133d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
133e0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
133f0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13400 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13410 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13420 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13430 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13440 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13450 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13460 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13470 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13480 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13490 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
134a0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
134b0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
134c0 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
134d0 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
134e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
134f0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13500 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13510 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13520 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13530 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13540 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13550 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13560 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13570 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13580 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13590 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
135a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
135b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
135c0 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
135d0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
135e0 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
135f0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13600 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13610 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13620 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13630 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13640 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13650 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13660 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13670 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13680 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13690 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
136a0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
136b0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
136c0 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
136d0 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
136e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
136f0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13700 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13710 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13720 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13730 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13740 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13750 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13760 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13770 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13780 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13790 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
137a0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
137b0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
137c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
137d0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
137e0 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
137f0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13800 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13810 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13820 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13830 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13840 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13850 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13860 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13870 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13880 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13890 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
138a0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
138b0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
138c0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
138d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
138e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
138f0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13900 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13910 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13920 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13930 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13940 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13950 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13970 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13980 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13990 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
139a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
139b0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
139c0 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
139d0 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
139e0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
139f0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13a00 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13a10 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13a20 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13a30 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13a40 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13a50 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13a60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13a70 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13a80 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13a90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13aa0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13ab0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13ac0 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13ad0 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13ae0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13af0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13b00 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13b20 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13b30 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13b40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13b50 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13b60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13b70 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13b80 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13b90 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13ba0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13bb0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13bc0 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13bd0 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13be0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13bf0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13c00 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13c10 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13c20 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13c30 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13c40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13c50 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13c60 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13c70 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13c80 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13c90 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13ca0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13cb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13cc0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13ce0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13cf0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13d00 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13d10 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13d20 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13d30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13d60 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13d70 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13d80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13d90 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13da0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13db0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13dc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13de0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13df0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13e00 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13e10 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13e20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
13e30 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
13e40 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13e50 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
13e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13e70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13e80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
13e90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13ea0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13eb0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
13ec0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13ed0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13ee0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13ef0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
13f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13f40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13f50 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
13f60 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13f70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13f80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
13f90 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
13fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
13fb0 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
13fc0 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
13fd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
13fe0 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
13ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
14000 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
14010 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
14020 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
14030 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
14040 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
14050 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
14060 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
14070 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
14080 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
14090 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
140a0 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
140b0 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
140c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
140d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
140e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
140f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
14100 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
14110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14130 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14140 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14150 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14160 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14170 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
14180 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14190 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
141a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
141b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
141c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
141d0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
141e0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
141f0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ter);.      pPag
14200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14220 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14230 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14240 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14250 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14260 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14280 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14290 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
142a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
142b0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
142c0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
142d0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
142e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
142f0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14310 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14320 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14330 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14340 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14350 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14360 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14380 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14390 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
143a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
143b0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
143c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
143d0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
143e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
143f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14400 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14410 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
14420 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14440 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14450 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
14460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
14470 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14480 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14490 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
144a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
144b0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
144c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
144d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
144e0 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
144f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14500 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14510 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
14520 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
14530 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
14540 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
14550 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
14560 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
14570 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14580 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14590 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
145a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
145b0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
145c0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
145d0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
145e0 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
145f0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14600 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14610 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
14620 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
14630 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
14640 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14650 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
14660 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14670 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14680 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
14690 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
146a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
146b0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
146c0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
146d0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
146e0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
146f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14700 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14710 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14720 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14730 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14740 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14750 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
14770 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
14780 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
14790 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
147a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
147b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
147c0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
147d0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
147e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
147f0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14800 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14810 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14830 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14840 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14850 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14860 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14870 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14880 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
14890 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
148a0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
148b0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
148c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
148d0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
148e0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
148f0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14900 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14910 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14920 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14930 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14940 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14950 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14960 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
14980 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
14990 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
149a0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
149b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
149c0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
149d0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
149e0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
149f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14a00 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14a10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14a20 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14a30 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14a40 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14a50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
14a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
14a70 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
14a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
14a90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14aa0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
14ab0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
14ac0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
14ad0 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
14ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14af0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
14b00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14b10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14b20 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
14b30 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14b40 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
14b50 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
14b60 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
14b70 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
14b80 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
14b90 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
14ba0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
14bb0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14bc0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14bd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14be0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14bf0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14c00 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14c10 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14c20 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14c30 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14c40 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14c50 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14c60 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14c80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14c90 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14ca0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14cb0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14cc0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14cd0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14ce0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14cf0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14d00 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14d10 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14d20 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14d30 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14d40 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14d50 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14d60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14d70 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14d80 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14d90 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14da0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14db0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14dc0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14dd0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14de0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14df0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14e00 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14e10 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14e20 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14e30 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14e40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14e50 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14e60 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14e70 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14e80 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14e90 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14ea0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14eb0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14ec0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14ed0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14ee0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14ef0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14f00 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14f10 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14f20 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14f30 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14f40 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14f50 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14f60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14f80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14f90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14fa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14fb0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14fc0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14fd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14fe0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15000 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15010 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15020 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15030 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15040 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15050 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15060 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15070 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15080 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15090 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
150a0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
150b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
150c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
150d0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
150e0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
150f0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15100 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15110 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15130 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15140 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15150 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15160 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15170 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15180 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15190 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
151a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
151b0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
151c0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
151d0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
151e0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
151f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15200 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15210 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15220 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15230 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15240 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15250 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15260 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15270 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15280 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15290 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
152a0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
152b0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
152c0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
152d0 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
152e0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
152f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15300 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15310 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15320 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15330 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15340 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15350 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15360 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15370 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15380 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15390 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
153a0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
153b0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
153c0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
153d0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
153e0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
153f0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15400 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15410 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15420 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15430 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15440 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15450 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15460 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15470 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15480 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15490 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
154a0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
154b0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
154c0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
154d0 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
154e0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
154f0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15500 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15510 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15520 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15530 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15540 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
15550 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
15560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
15570 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
15580 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15590 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
155a0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
155b0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
155c0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
155d0 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
155e0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
155f0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15600 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15610 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15620 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15630 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15640 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
15650 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
15660 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
15670 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15680 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15690 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
156a0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
156b0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
156c0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
156d0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15700 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15720 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15730 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15740 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
15750 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
15760 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15770 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
15780 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15790 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
157a0 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
157b0 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
157c0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
157d0 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
157e0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
157f0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
15800 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
15810 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
15820 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
15830 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
15840 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
15850 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
15860 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
15870 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
15880 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
15890 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
158a0 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
158b0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
158c0 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
158d0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
158e0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
158f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
15900 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
15910 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
15920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15930 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
15940 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
15950 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15960 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
15970 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
15980 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
15990 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
159a0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
159b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
159c0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
159d0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
159e0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
159f0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
15a00 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
15a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
15a20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15a30 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
15a40 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
15a50 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
15a60 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
15a70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15a80 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
15a90 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
15aa0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15ab0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
15ac0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
15ad0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
15ae0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
15af0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
15b00 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
15b10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
15b20 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
15b30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
15b40 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
15b50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
15b60 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
15b70 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
15b80 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
15b90 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
15ba0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15bb0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
15bc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
15bd0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
15be0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
15bf0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
15c00 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
15c10 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
15c20 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
15c30 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
15c40 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
15c50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
15c60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
15c70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15c80 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15c90 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15ca0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
15cb0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
15cc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
15cd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
15ce0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
15cf0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
15d00 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
15d20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
15d30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15d40 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
15d50 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
15d60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
15d70 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
15d80 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15d90 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15da0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
15db0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
15dc0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
15dd0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
15de0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
15df0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
15e00 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
15e10 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
15e20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
15e30 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
15e40 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
15e50 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
15e60 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15e70 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
15e80 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
15e90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15ea0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
15eb0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
15ec0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
15ed0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
15ee0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
15ef0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
15f00 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
15f10 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
15f20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15f30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
15f40 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
15f50 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15f60 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
15f70 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
15f80 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
15f90 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
15fa0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15fb0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
15fc0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
15fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
15fe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15ff0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16000 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16010 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16020 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16030 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16040 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16050 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16060 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16070 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16080 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16090 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
160a0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
160b0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
160c0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
160d0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
160e0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
160f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16100 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16110 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16120 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16130 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16150 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16160 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16180 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
161b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
161c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
161f0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16200 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16210 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16230 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16240 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16250 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16260 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16270 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16280 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16290 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
162a0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
162b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
162c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
162d0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
162e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
162f0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16310 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16320 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
16330 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
16340 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
16350 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
16360 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
16370 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
16380 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
16390 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
163a0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
163b0 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
163c0 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
163d0 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
163e0 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
163f0 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
16400 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
16410 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
16420 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
16430 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
16440 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
16450 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
16460 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
16470 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
16480 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
16490 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
164a0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
164b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
164c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
164d0 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
164e0 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
164f0 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  t) );..  /* Eith
16500 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20  er the state is 
16510 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47  greater than PAG
16520 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16530 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f  OD (a transactio
16540 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  n .  ** or savep
16550 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f  oint rollback do
16560 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73  ne at the reques
16570 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29  t of the caller)
16580 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   or this is.  **
16590 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
165a0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69  ollback. If it i
165b0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
165c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61  rollback, the pa
165d0 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73  ger.  ** is in s
165e0 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f  tate OPEN and ho
165f0 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  lds an EXCLUSIVE
16600 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e   lock. Hot-journ
16610 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  al rollback.  **
16620 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d   only reads from
16630 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16640 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a  l, not the sub-j
16650 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
16660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
16670 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16680 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
16690 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
166a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
166b0 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  EN && pPager->eL
166c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
166d0 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65  OCK).  );.  asse
166e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
166f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16700 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d  _CACHEMOD || isM
16710 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a  ainJrnl );..  /*
16720 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
16730 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
16740 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
16750 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
16760 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
16770 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
16780 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
16790 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
167a0 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
167b0 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
167c0 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
167d0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
167e0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
167f0 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
16800 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
16810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16820 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
16830 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
16840 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
16850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16860 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
16870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16880 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16890 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
168a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
168b0 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
168c0 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
168d0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
168e0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
168f0 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
16900 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
16910 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
16920 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
16930 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
16940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
16950 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
16960 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
16970 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
16980 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16990 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
169a0 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
169b0 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
169c0 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
169d0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
169e0 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
169f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16a00 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
16a10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
16a20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
16a30 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
16a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a50 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
16a60 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
16a70 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
16a80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
16a90 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
16aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16ab0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16ac0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16ad0 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16ae0 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
16af0 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
16b00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16b10 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
16b20 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
16b30 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
16b40 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
16b50 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16b80 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
16b90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16ba0 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65  ayed back before
16bb0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16bc0 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16bd0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16be0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16bf0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16c00 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16c10 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16c20 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16c30 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16c60 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16c70 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16c80 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16c90 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16ca0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16cb0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16cc0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16cd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16ce0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16cf0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16d00 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16d10 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16d20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16d30 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16d40 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16d50 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16d60 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16d70 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16d80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16d90 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16da0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16db0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16dc0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16dd0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16de0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16df0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16e00 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16e10 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16e30 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16e40 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16e50 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16e60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16e70 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16e80 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16e90 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16ea0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16eb0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16ec0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16ed0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16ee0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16ef0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16f00 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16f10 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16f20 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16f30 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16f40 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16f50 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16f60 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16f70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16f80 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16f90 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16fa0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16fb0 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16fc0 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16fd0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16fe0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16ff0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
17000 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
17010 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
17020 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
17030 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
17040 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
17050 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
17060 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
17070 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
17080 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
17090 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
170a0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
170b0 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
170c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
170d0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
170e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
170f0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
17100 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
17110 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
17120 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
17130 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
17140 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
17150 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
17160 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
17170 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
17180 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
17190 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
171a0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
171b0 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
171c0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
171d0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
171e0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
171f0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
17200 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
17210 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
17220 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
17230 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
17240 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
17250 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
17260 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
17270 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
17280 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
17290 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
172a0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
172b0 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
172c0 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
172d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
172e0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
172f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
17300 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
17310 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
17320 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
17330 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
17340 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
17350 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
17360 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
17370 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17380 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
17390 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
173a0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
173b0 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
173c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
173d0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
173e0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
173f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17400 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
17410 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17420 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
17430 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
17440 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
17450 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
17460 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
17470 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
17480 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
17490 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
174a0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
174b0 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
174c0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
174d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
174e0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
174f0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
17500 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
17510 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
17520 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
17530 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
17540 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
17550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
17560 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
17570 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
17580 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
17590 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
175a0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
175b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
175c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
175d0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
175e0 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
175f0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
17600 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17610 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17630 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17640 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17650 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17660 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17680 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17690 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
176a0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
176b0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
176c0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
176d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
176e0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
176f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17700 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17710 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17720 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17730 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17740 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17750 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17760 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17770 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17780 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17790 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
177a0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
177b0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
177c0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
177d0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
177e0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
177f0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17800 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17810 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17820 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17830 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17840 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17850 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17870 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17880 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17890 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
178a0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
178b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
178c0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
178d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
178e0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
178f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17900 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17910 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17920 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17930 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17940 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
17950 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17960 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17970 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
17980 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
17990 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
179a0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
179b0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
179c0 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  KPT, aData);.   
179d0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
179e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
179f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17a00 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17a10 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17a20 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17a30 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17a40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17a50 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
17a60 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
17a70 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
17a80 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
17a90 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
17aa0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
17ab0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17ac0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17ad0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17ae0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17af0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17b00 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17b10 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17b20 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17b30 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17b40 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
17b50 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
17b60 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
17b70 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
17b80 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
17b90 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
17ba0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
17bb0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17bc0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17bd0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17be0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17bf0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17c00 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17c10 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17c20 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17c30 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17c40 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17c50 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
17c60 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
17c70 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
17c80 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
17c90 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
17ca0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
17cb0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17cc0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17cd0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17ce0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17cf0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17d00 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17d10 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17d20 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17d30 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17d40 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17d50 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
17d60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
17d70 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
17d80 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17d90 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17da0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17db0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17dc0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17dd0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17de0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17df0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17e00 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
17e10 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
17e20 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
17e30 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
17e40 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
17e50 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
17e60 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
17e70 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17e80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17e90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17ea0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
17eb0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
17ec0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
17ed0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
17ee0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17ef0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17f00 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17f10 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17f20 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17f30 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17f40 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17f50 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17f60 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17f70 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17f80 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
17f90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
17fa0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
17fb0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
17fc0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
17fd0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
17fe0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17ff0 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18000 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18010 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18020 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18030 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18040 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18050 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18060 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18070 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18080 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18090 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
180a0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
180b0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
180c0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
180d0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
180e0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
180f0 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
18100 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
18110 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
18120 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
18130 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
18140 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
18150 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18160 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
18170 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
18180 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
18190 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
181a0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
181b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
181c0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
181d0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
181e0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
181f0 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
18200 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
18210 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
18220 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
18230 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18240 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
18250 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
18260 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
18270 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
18280 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
18290 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
182a0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
182b0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
182c0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
182d0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
182e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
182f0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
18300 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
18310 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
18320 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
18330 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
18340 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
18350 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
18360 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
18370 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18380 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
18390 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
183a0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
183b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
183c0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
183d0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
183e0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
183f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18400 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
18410 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
18420 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
18430 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
18440 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
18450 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
18460 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
18470 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
18480 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
18490 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
184a0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
184b0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
184c0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
184d0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
184e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
184f0 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
18500 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
18510 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
18520 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
18530 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
18540 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
18550 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
18560 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
18570 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
18580 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
18590 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
185a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
185b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
185c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
185d0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
185e0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
185f0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
18600 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
18610 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
18620 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
18630 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
18640 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
18650 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
18660 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
18670 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
18680 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
18690 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
186a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
186b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
186c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
186d0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
186e0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
186f0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
18700 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18710 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
18720 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18730 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18740 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18770 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18780 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
187a0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
187b0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
187c0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
187d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187e0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
187f0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18810 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18820 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
18830 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18840 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18850 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18860 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18870 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18880 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18890 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
188a0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
188b0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
188c0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
188d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
188e0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
188f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18900 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18910 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18920 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18930 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18940 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18950 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18960 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18970 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18980 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18990 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
189a0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
189b0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
189c0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
189d0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
189e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
189f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18a00 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18a20 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18a30 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18a40 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18a50 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18a60 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18a70 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18a80 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18a90 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18aa0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18ab0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18ac0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18ad0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18ae0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18b00 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18b10 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18b30 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18b40 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18b50 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18b70 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18b80 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18b90 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18ba0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18bb0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18bc0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18bd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18be0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18bf0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18c00 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18c10 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18c20 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18c30 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18c40 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18c50 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18c60 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18c70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18c80 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18c90 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18ca0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18cb0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18cc0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18cd0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18ce0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18cf0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18d00 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18d10 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18d20 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18d30 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18d40 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18d50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18d60 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18d70 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18d80 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18d90 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18da0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
18db0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
18dc0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18dd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18de0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18df0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18e00 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18e10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18e20 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18e30 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18e40 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18e50 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18e60 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18e70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18e80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18e90 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18ea0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18eb0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18ec0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18ed0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18ee0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18f00 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18f10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18f20 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18f30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18f40 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18f50 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18f80 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18f90 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18fa0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18fb0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18fc0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18fe0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18ff0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
19000 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19010 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
19020 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19030 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
19040 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
19050 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
19060 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
19070 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19080 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19090 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
190a0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
190b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
190c0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
190d0 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
190e0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
190f0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
19100 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
19110 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
19120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19130 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
19140 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
19150 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
19160 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
19170 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
19180 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19190 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
191a0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
191b0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
191c0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
191d0 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
191e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
191f0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19200 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19210 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19220 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
19230 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19240 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19250 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19260 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19270 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19280 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19290 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
192a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
192b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
192c0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
192d0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
192e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
192f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19300 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
19310 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19320 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
19330 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
19340 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
19350 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19360 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19370 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
19380 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
19390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
193a0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
193b0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
193c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
193d0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
193e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
193f0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
19400 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
19410 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
19420 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
19430 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
19440 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
19450 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
19460 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
19470 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
19480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19490 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
194a0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
194b0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
194c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
194d0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
194e0 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
194f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
19500 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
19510 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
19520 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
19530 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
19540 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
19550 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19570 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  MEM_BKPT;.    go
19580 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19590 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
195a0 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
195b0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
195c0 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
195d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
195e0 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
195f0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
19600 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
19610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19620 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19630 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
19640 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
19650 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
19660 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
19670 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
19680 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
19690 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
196a0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
196b0 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
196c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
196d0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
196e0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
196f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
19700 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
19710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19720 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
19730 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19740 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
19750 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
19760 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
19770 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
19780 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19790 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
197a0 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
197b0 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
197c0 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
197d0 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
197e0 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
197f0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
19800 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
19810 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
19820 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
19830 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
19840 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
19850 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
19860 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
19870 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
19880 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
19890 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
198a0 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
198b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
198c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
198d0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
198e0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
198f0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
19900 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
19910 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
19920 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
19930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19940 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
19950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19970 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19980 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19990 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
199a0 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
199b0 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
199c0 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
199d0 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
199e0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
199f0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
19a00 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
19a10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19a20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
19a30 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a50 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
19a60 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
19a70 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
19a80 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
19a90 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19ab0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
19ac0 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
19ad0 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
19ae0 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
19af0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
19b00 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
19b10 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19b20 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
19b30 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
19b40 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
19b50 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
19b60 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19b70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
19b80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19b90 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
19ba0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
19bb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
19bc0 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
19bd0 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
19be0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
19bf0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
19c00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
19c10 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
19c20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
19c30 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
19c40 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
19c50 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
19c60 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
19c70 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
19c80 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20  n, or the pager 
19c90 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72  is not in either
19ca0 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45  .** DBMOD or OPE
19cb0 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  N state, this fu
19cc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
19cd0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
19ce0 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68  e size .** of th
19cf0 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65  e file is change
19d00 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
19d10 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
19d20 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
19d30 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65   .** If the file
19d40 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
19d50 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
19d60 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
19d70 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
19d80 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
19d90 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
19da0 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
19db0 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
19dc0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
19dd0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
19de0 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
19df0 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
19e00 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
19e10 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
19e20 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
19e30 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
19e40 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
19e50 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
19e60 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
19e70 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
19e80 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
19e90 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
19ea0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
19eb0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
19ec0 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
19ed0 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
19ee0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
19ef0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
19f00 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
19f10 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
19f20 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
19f30 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19f40 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
19f50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
19f60 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
19f70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19f80 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
19f90 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
19fa0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
19fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
19fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19fd0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
19fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19ff0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1a000 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
1a010 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1a020 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
1a030 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1a040 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1a050 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1a060 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1a070 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
1a080 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
1a090 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
1a0a0 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
1a0b0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
1a0c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1a0d0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1a0e0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
1a0f0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
1a100 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
1a110 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
1a120 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a140 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
1a150 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
1a160 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
1a170 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
1a180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a190 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
1a1a0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
1a1b0 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
1a1c0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a1d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a1e0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
1a1f0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
1a200 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1a210 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61  currentSize+szPa
1a220 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ge)<=newSize ){.
1a230 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54          char *pT
1a240 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  mp = pPager->pTm
1a250 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
1a260 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20  memset(pTmp, 0, 
1a270 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  szPage);.       
1a280 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1a290 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
1a2a0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1a2b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a2c0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1a2d0 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
1a2e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a2f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1a300 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
1a310 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
1a320 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
1a330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1a340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a350 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1a360 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
1a370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a380 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a3a0 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73  a sanitized vers
1a3b0 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ion of the secto
1a3c0 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c  r-size of OS fil
1a3d0 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  e pFile. The.** 
1a3e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a3f0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69  guaranteed to li
1a400 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64  e between 32 and
1a410 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a430 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1a440 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1a450 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71  .  int iRet = sq
1a460 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1a470 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
1a480 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69  iRet<32 ){.    i
1a490 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  Ret = 512;.  }el
1a4a0 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f  se if( iRet>MAX_
1a4b0 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
1a4c0 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
1a4d0 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
1a4e0 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41  );.    iRet = MA
1a4f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
1a500 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
1a510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1a520 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1a530 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1a540 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
1a550 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
1a560 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
1a570 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a580 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
1a590 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
1a5a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1a5b0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
1a5c0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
1a5d0 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
1a5e0 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
1a5f0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
1a600 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
1a610 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1a620 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
1a630 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
1a640 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1a650 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
1a660 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
1a670 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a680 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1a690 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
1a6a0 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
1a6b0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
1a6c0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a6d0 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
1a6e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a6f0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a700 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
1a710 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
1a720 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
1a730 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
1a740 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
1a750 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
1a760 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
1a770 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
1a780 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
1a790 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
1a7a0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1a7b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
1a7c0 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
1a7d0 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
1a7e0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
1a7f0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
1a800 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
1a810 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
1a820 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a830 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
1a840 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
1a850 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
1a860 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1a870 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1a880 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1a890 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1a8a0 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1a8b0 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1a8c0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1a8d0 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1a8e0 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1a8f0 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1a900 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1a910 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1a920 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1a930 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1a940 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1a950 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1a960 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1a970 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1a980 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1a990 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a9a0 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1a9b0 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1a9c0 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1a9d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a9e0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1a9f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1aa00 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1aa10 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1aa20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1aa30 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1aa40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1aa50 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1aa60 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1aa70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1aa80 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1aa90 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1aaa0 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1aab0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1aac0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1aad0 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1aae0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1aaf0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1ab00 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1ab10 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1ab20 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1ab30 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1ab40 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1ab50 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1ab60 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1ab70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1ab80 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1ab90 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1aba0 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1abb0 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1abc0 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1abd0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1abe0 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1abf0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1ac00 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1ac10 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1ac20 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1ac30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1ac40 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1ac50 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1ac60 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1ac70 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1ac80 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1ac90 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1aca0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1acb0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1acc0 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1acd0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1ace0 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1acf0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1ad00 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1ad10 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1ad20 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1ad30 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1ad40 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1ad50 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1ad60 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1ad70 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1ad80 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1ad90 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1ada0 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1adb0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1adc0 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1add0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1ade0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1adf0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1ae00 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1ae10 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1ae20 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1ae30 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1ae40 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ae50 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1ae60 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1ae70 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1ae80 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1ae90 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1aea0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1aeb0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1aec0 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1aed0 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1aee0 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1aef0 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1af00 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1af10 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1af20 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1af30 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1af40 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1af50 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1af60 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1af70 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1af80 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1af90 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1afa0 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1afb0 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1afc0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1afd0 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1afe0 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1aff0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1b000 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b010 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1b020 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1b030 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1b040 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1b050 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1b060 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1b070 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1b080 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1b090 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b0a0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1b0b0 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1b0c0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1b0d0 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1b0e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1b0f0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1b100 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1b110 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1b120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b130 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1b140 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1b150 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1b160 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1b170 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1b180 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1b190 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1b1a0 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1b1b0 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1b1c0 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1b1d0 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1b1e0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1b1f0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1b200 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1b210 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1b220 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1b230 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1b240 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1b250 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1b260 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1b270 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1b280 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1b290 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1b2a0 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1b2b0 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1b2c0 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1b2d0 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1b2e0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1b2f0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1b300 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1b310 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1b320 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1b330 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1b340 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1b350 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1b360 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1b370 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1b380 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1b390 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1b3a0 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1b3b0 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1b3c0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1b3d0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1b3e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b3f0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1b400 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1b410 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1b420 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1b430 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1b440 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1b450 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1b460 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1b470 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1b480 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1b490 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1b4a0 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1b4b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1b4c0 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1b4d0 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1b4e0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1b4f0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1b500 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1b510 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1b520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1b530 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1b540 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1b550 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b560 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1b570 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1b580 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1b590 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1b5a0 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1b5b0 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1b5c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1b5d0 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1b5e0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1b5f0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1b600 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1b610 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1b620 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1b630 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1b640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1b650 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1b660 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1b670 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1b680 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1b690 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1b6a0 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1b6b0 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1b6c0 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1b6d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b6e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1b6f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1b700 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1b710 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1b720 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1b730 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1b740 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b750 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b760 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1b770 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1b780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b790 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1b7a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b7b0 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7d0 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1b7e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1b7f0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1b800 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b810 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1b820 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1b830 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b840 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b850 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1b860 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b870 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1b880 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1b890 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1b8a0 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1b8b0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1b8c0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1b8d0 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1b8e0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1b8f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1b900 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1b910 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1b920 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1b930 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1b940 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79  k */.  int nPlay
1b950 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  back = 0;       
1b960 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1b970 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65  of pages restore
1b980 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
1b990 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1b9a0 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1b9b0 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1b9c0 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1b9d0 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1b9e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1b9f0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1ba00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1ba10 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1ba20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1ba30 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1ba40 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1ba50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ba60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ba70 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1ba80 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1ba90 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1baa0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1bab0 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1bac0 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1bad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1bae0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1baf0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1bb00 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1bb10 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1bb20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1bb30 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1bb40 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1bb50 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1bb60 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1bb70 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1bb80 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1bb90 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1bba0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1bbb0 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1bbc0 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1bbd0 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1bbe0 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1bbf0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1bc00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1bc10 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1bc20 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1bc30 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1bc40 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69   ** mxPathname i
1bc50 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1bc60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1bc70 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1bc80 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1bc90 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1bca0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1bcb0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1bcc0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1bcd0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bce0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1bcf0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bd00 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1bd10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bd20 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1bd30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bd40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1bd50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1bd60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1bd70 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1bd80 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1bd90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1bda0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1bdb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bdc0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1bdd0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1bde0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1bdf0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1be00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1be10 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1be20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1be30 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1be40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1be50 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1be60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1be70 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1be80 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1be90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1beb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bec0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bed0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bee0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bef0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bf00 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bf10 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bf20 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bf30 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bf40 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bf50 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bf60 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bf70 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bf80 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1bf90 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1bfa0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1bfb0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1bfc0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1bfd0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1bfe0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1bff0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1c000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c010 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1c020 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1c030 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1c050 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c060 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1c070 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1c080 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1c090 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1c0a0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1c0b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1c0c0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1c0d0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1c0e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1c0f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c100 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1c110 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1c120 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1c130 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1c140 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1c150 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1c160 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1c170 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1c180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1c190 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1c1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c1b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c1c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1c1d0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1c1e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1c1f0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1c200 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1c210 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c220 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c230 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c240 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1c250 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1c260 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1c270 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1c280 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1c290 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1c2a0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1c2b0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1c2c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1c2d0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1c2e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1c2f0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c300 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c310 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c320 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c330 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c340 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c350 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c360 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c370 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c380 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c390 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c3a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c3b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c3c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c3d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c3e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c3f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c400 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c410 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c420 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c430 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c440 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c450 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c460 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c470 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c480 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c490 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c4a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c4b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c4c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c4d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c4e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c4f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c500 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c520 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c530 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c540 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c550 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c560 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c570 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c580 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c590 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c5a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c5b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c5c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c5d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c5e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c5f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c600 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c610 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c620 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c630 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c640 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c650 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c660 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c670 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c680 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c6a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c6b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c6c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c6d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c6e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c6f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c710 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c720 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c730 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c740 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c750 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c760 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c770 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c780 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c790 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c7a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c7b0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c7c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c7d0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c7e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c7f0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c800 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c810 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c820 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c830 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c840 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c850 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c860 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c880 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c8a0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c8b0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c8d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c8f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c900 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c920 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c940 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c950 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c960 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c970 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c980 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c990 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c9a0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c9b0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c9c0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c9d0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c9e0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c9f0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1ca00 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1ca10 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1ca20 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1ca30 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1ca40 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1ca50 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1ca60 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1ca70 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1ca80 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1ca90 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1caa0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1cab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1cac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cad0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1cae0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1caf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cb00 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1cb10 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1cb20 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1cb30 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1cb40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1cb50 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1cb60 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1cb70 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1cb80 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1cb90 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1cba0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1cbb0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1cbc0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1cbd0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1cbe0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1cbf0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1cc00 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1cc10 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1cc20 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1cc30 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cc50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1cc60 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1cc70 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1cc80 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1cc90 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1cca0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1ccb0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1ccc0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1ccd0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1cce0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1ccf0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1cd00 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1cd10 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1cd20 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1cd30 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1cd40 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1cd50 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1cd60 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1cd80 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1cd90 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1cda0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1cdb0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1cdc0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1cdd0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1cde0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1cdf0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1ce00 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1ce10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ce20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1ce30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1ce40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1ce50 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1ce60 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1ce70 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1ce80 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1ce90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cea0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1ceb0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cec0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1ced0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cee0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cef0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cf00 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cf10 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cf20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cf30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cf40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cf50 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cf60 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cf70 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cf80 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1cf90 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1cfa0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1cfb0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1cfc0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1cfd0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1cfe0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1cff0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1d000 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1d010 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1d020 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1d030 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1d040 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1d050 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1d060 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1d070 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1d080 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1d090 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1d0a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d0b0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1d0c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1d0d0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1d0e0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1d0f0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1d100 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1d110 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1d120 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1d130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1d140 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d150 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1d160 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d170 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1d180 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1d190 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1d1a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d1b0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1d1c0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1d1d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d1e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d1f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1d200 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1d210 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1d220 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d240 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1d260 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1d270 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d280 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1d290 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1d2a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1d2b0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1d2c0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1d2d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1d2e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1d2f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d300 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d310 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d320 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d330 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d340 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d350 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d360 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d370 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d380 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d390 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d3a0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d3b0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d3c0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d3d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d3e0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d3f0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d400 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d410 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d420 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d430 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d440 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d450 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d460 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d470 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d480 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d490 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d4a0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d4b0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d4c0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d4d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d4e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d4f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d500 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d520 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d530 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d540 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d550 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d560 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d570 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d580 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d590 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d5a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d5b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d5c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d5d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d5e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d5f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d600 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d610 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d620 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d630 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d650 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d660 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d670 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d680 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d690 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d6a0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d6b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d6c0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d6d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d6e0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d6f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d700 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d710 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d720 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d740 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d750 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d760 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d770 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d780 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d790 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d7a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d7b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d7c0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d7d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d7e0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d7f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d800 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d810 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d820 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d830 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d840 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d860 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d870 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d880 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d890 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d8a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d8b0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d8c0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d8d0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d8e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d8f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d900 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d910 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d930 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d950 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d960 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d970 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d980 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d990 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d9a0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d9b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d9c0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d9d0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d9e0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d9f0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1da00 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1da10 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1da20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1da30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1da40 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1da50 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1da60 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1da70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1da80 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1da90 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1daa0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1dab0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1dac0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1dad0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1dae0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1daf0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1db00 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1db10 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1db20 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1db30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1db40 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1db50 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1db60 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1db70 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1db80 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1db90 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1dba0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1dbb0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1dbc0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1dbd0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1dbe0 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1dbf0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1dc00 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1dc10 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1dc20 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1dc30 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1dc40 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1dc50 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1dc60 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1dc70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1dc80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dc90 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1dca0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1dcb0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1dcc0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1dcd0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1dce0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1dcf0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1dd00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1dd10 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1dd20 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1dd30 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1dd40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1dd50 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1dd60 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1dd70 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1dd80 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1dd90 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1dda0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1ddb0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1ddc0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1ddd0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1dde0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1ddf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1de00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1de10 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1de20 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1de30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1de40 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1de50 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1de60 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1de70 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1de80 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1de90 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1dea0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1deb0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1dec0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1ded0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1dee0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1def0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1df00 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1df10 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1df20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1df30 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1df40 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1df50 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1df60 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1df70 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1df80 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1df90 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1dfa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dfb0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1dfc0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1dfd0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1dfe0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1dff0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1e000 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1e010 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1e020 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1e030 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1e040 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e050 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1e060 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e070 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1e080 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1e090 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1e0a0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1e0b0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1e0c0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1e0d0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1e0e0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1e0f0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1e100 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1e110 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1e120 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1e130 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1e140 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1e150 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e160 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1e170 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1e180 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e190 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1e1a0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1e1b0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1e1c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e1d0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1e1e0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1e1f0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1e200 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1e210 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1e220 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e230 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1e240 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1e250 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e260 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1e270 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1e280 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1e290 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1e2a0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1e2b0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1e2c0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1e2d0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1e2e0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1e2f0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1e300 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1e310 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e320 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1e330 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1e340 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1e350 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1e360 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1e370 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e380 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e390 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e3a0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e3b0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e3c0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e3d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e3e0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e3f0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e400 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e410 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e420 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e430 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e440 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e450 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e460 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e480 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e490 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e4a0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e4b0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e4c0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e4d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e4e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e4f0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e500 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e510 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e520 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e530 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e540 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e550 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e560 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e580 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e590 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e5a0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e5b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e5c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e5d0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e5e0 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e610 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e620 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e650 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e670 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e680 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e690 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e6a0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e6b0 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e6c0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e6d0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e6e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e6f0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e700 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e710 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e720 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e730 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e740 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e750 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e760 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e770 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e780 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e790 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e7a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e7b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e7c0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e7d0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1e7e0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1e7f0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1e800 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1e810 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1e820 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1e830 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1e840 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1e850 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1e860 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1e870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e880 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e890 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e8a0 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1e8b0 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1e8c0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1e8d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1e8e0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1e8f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e900 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e920 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1e930 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e950 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1e960 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1e970 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1e980 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e990 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1e9a0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1e9b0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1e9c0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1e9d0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1e9e0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1e9f0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1ea00 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1ea10 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1ea20 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1ea30 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1ea40 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1ea50 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1ea60 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1ea70 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1ea80 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1ea90 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1eaa0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1eab0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1eac0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1ead0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1eae0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1eaf0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1eb00 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1eb10 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1eb20 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1eb30 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1eb40 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1eb50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1eb60 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1eb70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1eb80 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1eb90 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1eba0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1ebb0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1ebc0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1ebd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ebe0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ebf0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1ec00 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1ec10 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1ec20 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1ec30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ec40 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1ec50 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1ec60 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1ec70 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1ec80 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1ec90 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1eca0 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1ecb0 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1ecc0 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1ecd0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1ece0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1ecf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ed00 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1ed10 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1ed20 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1ed30 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1ed40 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1ed50 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1ed60 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1ed70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ed80 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1ed90 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1edb0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1edc0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1edf0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1ee00 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1ee30 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1ee40 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1ee50 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1ee60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ee70 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1ee80 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1ee90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1eeb0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1eec0 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1eef0 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20  es in pList */. 
1ef00 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1ef30 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20  over pages */.. 
1ef40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ef50 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1ef60 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1ef70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ef80 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1ef90 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1efa0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1efb0 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1efc0 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1efd0 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1efe0 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1eff0 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1f000 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1f010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1f020 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1f030 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1f040 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1f050 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1f060 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1f070 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1f080 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1f090 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1f0a0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1f0b0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1f0c0 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1f0d0 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1f0e0 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1f0f0 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1f100 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1f110 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1f120 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1f130 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1f140 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1f150 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  /.    PgHdr **pp
1f160 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1f170 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1f180 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1f190 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1f1a0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f1b0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1f1c0 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1f1d0 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1f1e0 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1f1f0 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1f200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1f210 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1f220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1f230 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1f240 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1f250 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1f260 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1f270 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1f280 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1f290 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1f2a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f2b0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1f2c0 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1f2d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1f2e0 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1f2f0 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
1f300 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
1f310 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1f320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1f330 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1f340 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f350 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f370 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1f380 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1f390 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1f3a0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1f3b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f3c0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1f3d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f3e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f3f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f400 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f410 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f420 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1f430 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1f440 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1f450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1f460 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1f470 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1f480 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f490 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1f4a0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1f4b0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1f4c0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1f4d0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1f4e0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1f4f0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1f500 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1f510 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1f520 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1f530 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1f540 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1f550 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1f560 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1f570 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1f580 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1f590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f5a0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1f5b0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1f5c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f5d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f5f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f600 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f620 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1f630 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1f640 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1f650 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1f660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f670 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f680 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1f690 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f6a0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1f6b0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f6c0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1f6d0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1f6e0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1f6f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f700 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f710 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1f720 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1f730 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1f740 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1f750 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1f760 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1f770 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1f780 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1f790 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1f7a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1f7b0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f7c0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1f7d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f7e0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1f7f0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f800 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1f810 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1f820 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1f830 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1f840 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1f850 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
1f860 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
1f870 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
1f880 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
1f890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f8a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1f8b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f8c0 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1f8d0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1f8e0 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1f8f0 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1f900 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1f910 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1f920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f930 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1f940 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1f950 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1f960 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1f970 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1f980 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1f990 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1f9a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f9b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f9c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1f9d0 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1f9e0 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1f9f0 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1fa00 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1fa10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1fa20 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1fa30 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1fa40 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1fa50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1fa60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1fa70 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1fa80 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1fa90 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fab0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1fac0 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1fad0 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1fae0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1faf0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1fb00 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1fb10 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1fb20 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1fb30 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1fb40 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1fb50 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1fb60 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1fb70 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1fb80 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1fb90 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1fba0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1fbb0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1fbc0 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1fbd0 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1fbe0 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1fbf0 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1fc00 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1fc10 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1fc20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1fc30 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1fc40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fc50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1fc60 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50  RED_LOCK );.  nP
1fc70 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1fc80 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1fc90 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1fca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1fcb0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1fcc0 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  se is not availa
1fcd0 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ble from the.  *
1fce0 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  * WAL sub-system
1fcf0 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  , determine the 
1fd00 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65  page counte base
1fd10 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
1fd20 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1fd30 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1fd40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1fd50 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
1fd60 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65  t an.  ** intege
1fd70 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1fd80 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75  e page-size, rou
1fd90 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74  nd up the result
1fda0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1fdb0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1fdc0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fde0 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1fdf0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1fe00 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1fe10 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1fe20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1fe30 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1fe40 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1fe50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1fe60 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1fe70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1fe80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fe90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fea0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1feb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fec0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
1fed0 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
1fee0 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
1fef0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
1ff00 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1ff10 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1ff20 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1ff30 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ff40 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1ff50 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1ff60 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1ff70 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1ff80 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1ff90 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1ffa0 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1ffb0 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1ffc0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1ffd0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1ffe0 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1fff0 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
20000 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
20010 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
20020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20030 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
20040 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
20050 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
20060 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
20070 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
20080 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
20090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
200a0 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
200b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
200c0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
200d0 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
200e0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
200f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20100 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
20110 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20120 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
20130 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
20140 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
20150 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
20160 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
20170 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
20180 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
20190 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
201a0 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
201b0 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
201c0 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
201d0 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
201e0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
201f0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
20200 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
20210 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
20220 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
20230 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
20240 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
20250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20260 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
20270 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
20280 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
20290 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
202a0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
202b0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
202c0 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
202d0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
202e0 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
202f0 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
20300 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
20310 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
20320 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
20330 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
20340 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
20350 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
20360 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
20370 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
20380 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
20390 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
203a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
203b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
203c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
203d0 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
203e0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
203f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
20400 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20410 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20420 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20440 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
20450 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
20460 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20480 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
20490 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
204a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
204b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
204c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
204d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
204e0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
204f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20500 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
20510 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20520 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
20530 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20540 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
20550 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51  _NOENT ) rc = SQ
20560 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
20570 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
20580 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20590 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
205a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
205b0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
205c0 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
205d0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
205e0 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
205f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
20600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20610 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
20620 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20630 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
20640 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
20650 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
20660 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20670 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
20680 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20690 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
206a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
206b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
206c0 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
206d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
206e0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
206f0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
20700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20710 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20720 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20730 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
20740 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
20750 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
20760 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
20770 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
20780 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
20790 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
207a0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
207b0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
207c0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
207d0 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
207e0 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
207f0 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
20800 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
20810 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
20820 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
20830 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
20840 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
20850 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20860 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
20870 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
20880 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
20890 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
208a0 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
208b0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
208c0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
208d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
208e0 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
208f0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
20900 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20910 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
20920 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
20930 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20940 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20950 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20960 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20970 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
20980 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20990 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
209a0 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
209b0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
209c0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
209d0 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
209e0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
209f0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
20a00 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
20a10 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
20a20 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
20a30 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
20a40 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20a50 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
20a60 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20a70 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
20a80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20a90 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
20aa0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
20ab0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
20ac0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
20ad0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
20ae0 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
20af0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
20b00 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
20b10 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20b20 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
20b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20b40 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
20b50 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
20b60 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
20b70 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
20b80 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
20b90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
20ba0 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
20bb0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
20bc0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
20bd0 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
20be0 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
20bf0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
20c00 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
20c10 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
20c20 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
20c30 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
20c40 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
20c50 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
20c60 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
20c70 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
20c80 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
20c90 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20ca0 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
20cb0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
20cc0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
20cd0 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
20ce0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
20cf0 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
20d00 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
20d10 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
20d20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
20d30 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
20d40 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
20d50 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
20d60 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
20d70 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
20d80 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
20d90 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
20da0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
20db0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
20dc0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
20dd0 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
20de0 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
20df0 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
20e00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
20e10 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
20e20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20e30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
20e40 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
20e50 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
20e60 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
20e70 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20e80 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
20e90 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20eb0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
20ec0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
20ed0 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
20ee0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20ef0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
20f00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
20f10 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
20f20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
20f30 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
20f40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
20f50 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
20f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20f70 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
20f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20f90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
20fa0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
20fb0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
20fc0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
20fd0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
20fe0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
20ff0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
21000 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21010 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
21020 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
21030 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
21040 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
21050 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
21060 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21070 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
21080 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
21090 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
210a0 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
210b0 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
210c0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
210d0 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
210e0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
210f0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
21100 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
21110 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
21120 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
21130 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
21140 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
21150 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
21160 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
21170 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
21180 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
211a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
211b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
211c0 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
211d0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
211e0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
211f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
21200 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
21210 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
21220 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
21230 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
21240 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
21250 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
21260 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
21270 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
21280 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
21290 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
212a0 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
212b0 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
212c0 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
212d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
212e0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
212f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
21300 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
21310 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
21320 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
21330 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
21340 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21350 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
21360 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
21370 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
21380 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
21390 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
213a0 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
213b0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
213c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
213d0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
213e0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
213f0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
21400 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
21410 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
21420 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
21430 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
21440 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
21450 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
21460 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
21470 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
21480 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
21490 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
214a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
214b0 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
214c0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
214d0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
214e0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
214f0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
21500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21510 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21520 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
21530 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21540 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
21550 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
21560 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
21570 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21580 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21590 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
215a0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
215b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
215c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
215d0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
215e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
215f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
21600 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
21610 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21620 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
21630 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
21640 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
21650 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
21660 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
21670 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
21680 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
21690 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
216a0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
216b0 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
216c0 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
216d0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
216e0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
216f0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21700 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
21710 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21720 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
21730 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21740 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21760 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21770 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
21780 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21790 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
217a0 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
217b0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
217c0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
217d0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
217e0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
217f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21800 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
21810 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
21820 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21830 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21840 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21850 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
21860 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
21870 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
21880 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
21890 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
218a0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
218b0 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
218c0 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
218d0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
218e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
218f0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
21900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21910 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21920 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21930 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
21940 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
21950 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
21960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21970 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
21980 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
21990 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
219a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
219b0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
219c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
219d0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
219e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
219f0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21a00 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21a10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21a20 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21a30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21a40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21a50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21a70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21a80 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
21a90 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
21aa0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
21ab0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
21ac0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
21ad0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
21ae0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
21af0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21b00 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
21b10 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
21b20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
21b30 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
21b40 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21b50 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21b60 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21b70 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21b80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21b90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
21ba0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
21bb0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21bc0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
21bd0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
21be0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
21bf0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
21c00 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
21c10 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
21c20 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
21c30 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
21c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21c50 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
21c60 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
21c70 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
21c80 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
21c90 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
21ca0 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
21cb0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
21cc0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
21cd0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21ce0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21cf0 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
21d00 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
21d10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21d20 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21d30 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
21d40 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
21d50 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
21d60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21d80 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
21d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21da0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21db0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21dc0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
21dd0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
21de0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
21df0 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
21e00 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
21e10 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
21e20 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
21e30 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
21e40 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
21e50 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
21e60 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
21e70 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
21e80 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
21e90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
21ea0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
21eb0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
21ec0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
21ed0 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
21ee0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
21ef0 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
21f00 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
21f10 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
21f20 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
21f30 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
21f40 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21f50 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
21f60 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
21f70 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
21f80 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
21f90 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
21fa0 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
21fb0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
21fc0 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
21fd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
21fe0 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
21ff0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
22000 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
22010 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
22020 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
22030 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
22040 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
22050 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
22060 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
22070 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
22080 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
22090 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
220a0 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
220b0 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  sz>0);.    sqlit
220c0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
220d0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
220e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
220f0 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20  P_SIZE, &sz);.  
22100 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
22110 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
22120 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79  imum size of any
22130 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
22140 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  made of the data
22150 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  base file..*/.vo
22160 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22170 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65  etMmapLimit(Page
22180 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74  r *pPager, sqlit
22190 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
221a0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  {.  pPager->szMm
221b0 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70  ap = szMmap;.  p
221c0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
221d0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
221e0 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d  * Free as much m
221f0 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
22200 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
22210 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22220 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67  3PagerShrink(Pag
22230 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
22240 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69  qlite3PcacheShri
22250 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nk(pPager->pPCac
22260 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  he);.}../*.** Ad
22270 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66  just settings of
22280 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68   the pager to th
22290 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  ose specified in
222a0 20 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72   the pgFlags par
222b0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
222c0 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46  e "level" in pgF
222d0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
222e0 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65  CHRONOUS_MASK se
222f0 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  ts the robustnes
22300 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  s.** of the data
22310 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
22320 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
22330 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
22340 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e  es by.** changin
22350 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
22360 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
22370 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
22380 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  ls..** There are
22390 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
223a0 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
223b0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
223c0 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
223d0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
223e0 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
223f0 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
22400 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
22410 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
22420 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
22430 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
22440 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
22450 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
22460 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22470 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
22480 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
22490 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
224a0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
224b0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
224c0 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
224d0 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
224e0 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
22500 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
22510 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
22520 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
22530 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
22540 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
22550 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
22560 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
22570 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
22580 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
22590 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
225a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
225b0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
225c0 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
225d0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
225e0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
22600 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
22610 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
22620 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
22630 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
22640 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
22650 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
22660 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
22670 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
22680 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22690 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
226a0 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
226b0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
226c0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
226d0 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
226e0 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
226f0 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
22700 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
22710 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
22720 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
22730 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
22740 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22750 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
22760 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
22770 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
22780 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
22790 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
227a0 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a  for a rollback-j
227b0 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f  ournal mode.  Fo
227c0 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20  r WAL mode, OFF 
227d0 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20  continues.** to 
227e0 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e  mean that no syn
227f0 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20  cs ever occur.  
22800 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61  NORMAL means tha
22810 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e  t the WAL is syn
22820 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ced.** prior to 
22830 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65  the start of che
22840 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74  ckpoint and that
22850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22860 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  le is synced.** 
22870 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
22880 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  n of the checkpo
22890 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72  int if the entir
228a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
228b0 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74   WAL.** was writ
228c0 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
228d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74  e database.  But
228e0 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69   no sync operati
228f0 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a  ons occur for.**
22900 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d   an ordinary com
22910 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f  mit in NORMAL mo
22920 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55  de with WAL.  FU
22930 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
22940 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73  e WAL.** file is
22950 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
22960 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70  g each commit op
22970 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69  eration, in addi
22980 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73  tion to the.** s
22990 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20  yncs associated 
229a0 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a  with NORMAL..**.
229b0 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73  ** Do not confus
229c0 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  e synchronous=FU
229d0 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53  LL with SQLITE_S
229e0 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a  YNC_FULL.  The.*
229f0 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  * SQLITE_SYNC_FU
22a00 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74  LL macro means t
22a10 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58  o use the MacOSX
22a20 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e  -style full-fsyn
22a30 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c  c.** using fcntl
22a40 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20  (F_FULLFSYNC).  
22a50 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22a60 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61  AL means to do a
22a70 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73  n.** ordinary fs
22a80 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65  ync() call.  The
22a90 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
22aa0 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49  nce between SQLI
22ab0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20  TE_SYNC_FULL.** 
22ac0 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  and SQLITE_SYNC_
22ad0 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f  NORMAL on platfo
22ae0 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d  rms other than M
22af0 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a  acOSX.  But the.
22b00 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ** synchronous=F
22b10 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68  ULL versus synch
22b20 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65  ronous=NORMAL se
22b30 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73  tting determines
22b40 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79   when.** the xSy
22b50 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20  nc primitive is 
22b60 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65  called and is re
22b70 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c  levant to all pl
22b80 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e  atforms..**.** N
22b90 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
22ba0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22bb0 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
22bc0 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
22bd0 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
22be0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22bf0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
22c00 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
22c10 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a  3PagerSetFlags(.
22c20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22c30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22c40 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
22c50 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
22c60 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
22c70 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  gs      /* Vario
22c80 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  us flags */.){. 
22c90 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20   unsigned level 
22ca0 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  = pgFlags & PAGE
22cb0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
22cc0 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  SK;.  if( pPager
22cd0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
22ce0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
22cf0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
22d00 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a  ->fullSync = 0;.
22d10 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
22d20 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  aSync = 0;.  }el
22d30 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22d40 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
22d50 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
22d60 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20  US_OFF ?1:0;.   
22d70 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22d80 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52  c = level>=PAGER
22d90 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c  _SYNCHRONOUS_FUL
22da0 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  L ?1:0;.    pPag
22db0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
22dc0 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e  level==PAGER_SYN
22dd0 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f  CHRONOUS_EXTRA ?
22de0 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1:0;.  }.  if( p
22df0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
22e00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22e10 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
22e20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22e30 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
22e40 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
22e50 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43   PAGER_FULLFSYNC
22e60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22e70 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22e80 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
22e90 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22ea0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22eb0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
22ec0 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
22ed0 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
22ee0 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22ef0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22f00 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22f10 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22f20 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22f30 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22f40 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
22f50 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22f60 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22f70 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22f80 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22f90 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22fa0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
22fb0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
22fc0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
22fd0 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
22fe0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22ff0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
23000 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
23010 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
23020 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IONS;.  }.  if( 
23030 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23040 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20  CACHESPILL ){.  
23050 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23060 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
23070 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b  AG_OFF;.  }else{
23080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
23090 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
230a0 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a  FLAG_OFF;.  }.}.
230b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
230c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
230d0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
230e0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
230f0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
23100 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
23110 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
23120 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
23130 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
23140 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
23150 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
23160 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
23170 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
23180 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
23190 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
231a0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
231b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
231c0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
231d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
231e0 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
231f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
23200 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
23210 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
23220 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
23230 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
23240 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
23250 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
23260 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
23270 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
23280 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
23290 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
232a0 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
232b0 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
232c0 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
232d0 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
232e0 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
232f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
23300 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23310 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
23320 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
23330 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23340 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
23350 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23360 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
23370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
23380 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
23390 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
233a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
233b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
233c0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
233d0 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
233e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
233f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
23400 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
23410 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
23420 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
23430 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
23440 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23450 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23460 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
23470 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
23480 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
23490 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
234a0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
234b0 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
234c0 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
234d0 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
234e0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
234f0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
23500 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
23510 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23520 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
23530 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
23540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23550 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
23560 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
23570 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
23580 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23590 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
235a0 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
235b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
235c0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
235d0 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
235e0 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
235f0 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
23600 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
23610 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
23620 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
23630 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23640 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
23650 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
23660 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
23670 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
23680 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
23690 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
236a0 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
236b0 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
236c0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
236d0 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
236e0 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
236f0 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
23700 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
23710 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
23720 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
23730 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
23740 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
23750 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
23760 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
23770 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
237a0 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
237b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237e0 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
237f0 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
23800 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
23810 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
23820 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
23830 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
23840 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23850 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23860 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
23870 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
23880 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
23890 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
238a0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
238b0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
238c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
238d0 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
238e0 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
238f0 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
23900 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
23910 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
23920 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
23930 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
23940 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
23950 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23960 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
23970 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
239a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
239b0 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
239c0 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
239d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
239e0 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
239f0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
23a00 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a20 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
23a30 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
23a40 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  er */.){.  pPage
23a50 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
23a60 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
23a70 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
23a80 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
23a90 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20  yHandlerArg;..  
23aa0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23ab0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  r->fd) ){.    vo
23ac0 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20  id **ap = (void 
23ad0 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73  **)&pPager->xBus
23ae0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73  yHandler;.    as
23af0 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76  sert( ((int(*)(v
23b00 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d  oid *))(ap[0]))=
23b10 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b  =xBusyHandler );
23b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b  .    assert( ap[
23b30 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72  1]==pBusyHandler
23b40 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Arg );.    sqlit
23b50 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
23b60 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
23b70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53  SQLITE_FCNTL_BUS
23b80 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20  YHANDLER, (void 
23b90 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  *)ap);.  }.}../*
23ba0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
23bb0 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
23bc0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23bd0 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
23be0 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
23bf0 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
23c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
23c10 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
23c20 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
23c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23c40 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
23c50 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
23c60 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
23c70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
23c80 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
23c90 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
23ca0 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51  ITE_IOERR, an SQ
23cb0 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73  LITE_IOERR_xxx s
23cc0 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54  ub-code or SQLIT
23cd0 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
23ce0 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
23cf0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
23d00 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
23d10 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
23d20 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
23d30 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
23d40 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
23d50 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
23d60 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
23d70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
23d80 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
23d90 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
23da0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
23db0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23dc0 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
23dd0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
23de0 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
23df0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
23e00 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
23e10 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
23e20 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
23e30 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
23e40 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
23e50 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
23e60 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
23e70 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
23e80 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
23e90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
23ea0 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
23eb0 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
23ec0 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
23ed0 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
23ee0 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
23ef0 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
23f00 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
23f10 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
23f20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
23f30 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
23f40 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23f50 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
23f60 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
23f70 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
23f80 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
23f90 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
23fa0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23fb0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
23fc0 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
23fd0 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
23fe0 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
23ff0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
24000 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
24010 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
24020 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
24030 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
24040 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
24050 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
24060 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
24070 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
24080 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
24090 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
240a0 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
240b0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
240c0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
240d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
240e0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
240f0 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67  Pager, u32 *pPag
24100 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
24110 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
24120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
24130 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
24140 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
24150 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
24160 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
24170 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
24180 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
24190 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
241a0 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
241b0 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
241c0 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
241d0 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
241e0 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
241f0 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70  **.  ** At one p
24200 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  oint this functi
24210 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
24220 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  rror if the page
24230 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50  r was in .  ** P
24240 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
24250 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45  . But since PAGE
24260 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75  R_ERROR state gu
24270 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20  arantees that.  
24280 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c  ** there is at l
24290 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
242a0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
242b0 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nce, this functi
242c0 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  on.  ** is a no-
242d0 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65  op for that case
242e0 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20   anyhow..  */.. 
242f0 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20   u32 pageSize = 
24300 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
24310 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
24320 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
24330 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
24340 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
24350 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
24360 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
24370 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
24380 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71  ize==0).   && sq
24390 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
243a0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
243b0 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70  che)==0 .   && p
243c0 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
243d0 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72  ize!=(u32)pPager
243e0 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b  ->pageSize .  ){
243f0 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
24400 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
24410 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20      /* New temp 
24420 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34  space */.    i64
24430 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20   nByte = 0;..   
24440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
24450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26  ate>PAGER_OPEN &
24460 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
24470 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63  >fd) ){.      rc
24480 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
24490 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
244a0 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a   &nByte);.    }.
244b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
244c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
244d0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
244e0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
244f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
24500 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20   if( !pNew ) rc 
24510 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
24520 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
24530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24540 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
24550 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
24560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24570 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
24580 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
24590 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
245a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
245b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
245c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
245d0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
245e0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
245f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24600 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
24610 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
24620 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
24630 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
24640 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
24650 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
24660 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  geSize;.    }els
24670 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
24680 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  PageFree(pNew);.
24690 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
246a0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
246b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
246c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
246d0 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
246e0 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
246f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
24700 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
24710 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
24720 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
24730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
24740 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
24750 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
24760 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
24770 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
24780 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
24790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
247a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
247b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
247c0 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
247d0 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
247e0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
247f0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
24800 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
24810 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
24820 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
24830 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
24840 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
24850 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
24860 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
24870 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
24880 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
24890 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
248a0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
248b0 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
248c0 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
248d0 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
248e0 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
248f0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
24900 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
24910 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
24920 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
24930 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24940 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
24950 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
24960 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
24970 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
24980 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
24990 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
249a0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
249b0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
249c0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
249d0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
249e0 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
249f0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
24a00 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
24a10 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
24a20 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
24a30 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
24a40 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
24a50 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
24a60 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
24a70 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
24a80 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
24a90 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
24aa0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
24ab0 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
24ac0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
24ad0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
24ae0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24af0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24b00 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
24b10 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
24b20 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
24b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24b40 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
24b50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
24b60 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
24b70 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
24b80 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24b90 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
24ba0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24bb0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
24bc0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
24bd0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
24be0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
24bf0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
24c00 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
24c10 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
24c20 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
24c30 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
24c40 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24c50 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
24c60 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
24c70 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
24c80 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
24c90 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
24ca0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
24cb0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
24cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24cd0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24ce0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24cf0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
24d00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24d10 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
24d20 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
24d30 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
24d40 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24d50 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
24d60 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
24d70 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
24d80 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24d90 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
24da0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
24db0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24dc0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
24dd0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24de0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
24df0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24e00 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24e10 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
24e20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
24e30 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24e40 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
24e50 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
24e60 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
24e70 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
24e80 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
24e90 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
24ea0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
24eb0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
24ec0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
24ed0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
24ee0 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
24ef0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
24f00 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
24f10 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
24f20 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
24f30 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
24f40 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
24f50 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
24f60 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
24f70 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
24f80 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
24f90 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
24fa0 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
24fb0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
24fc0 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
24fd0 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
24fe0 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
24ff0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
25000 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
25010 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
25020 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
25030 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
25040 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
25050 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
25060 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
25070 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
25080 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
25090 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
250a0 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
250b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
250c0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
250d0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
250e0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
250f0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
25100 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25110 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
25120 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
25130 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
25140 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
25150 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
25160 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
25170 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
25180 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
25190 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
251a0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
251b0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
251c0 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
251d0 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
251e0 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
251f0 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
25200 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
25210 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
25220 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
25230 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
25240 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
25250 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
25260 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
25270 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
25280 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
25290 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
252a0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
252b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
252c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
252d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
252e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
252f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25300 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25310 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
25320 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
25330 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
25340 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
25350 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
25360 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
25370 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
25380 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
25390 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
253a0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
253b0 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
253c0 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
253d0 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
253e0 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
253f0 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
25400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25410 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
25420 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25430 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
25440 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25450 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
25460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25470 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
25480 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
25490 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
254a0 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
254b0 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
254c0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
254d0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
254e0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
254f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25500 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
25510 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
25520 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
25530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25540 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
25550 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
25560 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
25570 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
25580 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
25590 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
255a0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
255b0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
255c0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
255d0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
255e0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
255f0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
25600 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
25610 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
25620 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
25630 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
25640 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
25650 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
25660 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
25670 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
25680 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
25690 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
256a0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
256b0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
256c0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
256d0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
256e0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
256f0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
25700 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
25710 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
25720 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
25730 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
25740 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
25750 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25780 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
25790 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
257a0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
257b0 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
257c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
257d0 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
257e0 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e  ady held), or on
257f0 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  e of the transit
25800 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
25810 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
25820 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
25830 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
25840 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
25850 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
25860 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
25870 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
25880 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
25890 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
258a0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
258b0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
258c0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
258d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
258e0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
258f0 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
25900 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25910 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
25920 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
25930 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
25940 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
25950 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
25960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
25970 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
25980 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
25990 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
259a0 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
259b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
259c0 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
259d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
259e0 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
259f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
25a00 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
25a10 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
25a20 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
25a30 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
25a40 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
25a50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
25a60 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
25a70 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
25a80 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
25a90 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
25aa0 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
25ab0 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
25ac0 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
25ad0 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
25ae0 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
25af0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
25b00 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
25b10 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
25b20 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
25b30 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
25b40 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
25b50 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
25b60 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
25b70 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
25b80 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
25b90 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
25ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
25bb0 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
25bc0 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
25bd0 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
25be0 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
25bf0 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
25c00 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
25c10 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
25c20 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
25c30 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
25c40 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
25c50 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
25c60 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
25c70 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
25c80 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
25c90 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
25ca0 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
25cb0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
25cc0 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
25cd0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
25ce0 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
25cf0 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
25d00 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
25d10 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
25d20 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
25d30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
25d40 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
25d50 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
25d60 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
25d70 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
25d80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
25d90 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
25da0 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
25db0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
25dc0 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
25dd0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
25de0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
25df0 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
25e00 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
25e10 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
25e20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
25e30 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
25e40 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25e50 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25e60 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
25e70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
25e80 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
25e90 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
25ea0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
25eb0 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
25ec0 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
25ed0 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
25ee0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25ef0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25f00 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25f10 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25f20 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
25f30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25f40 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25f50 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
25f60 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
25f70 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25f80 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
25f90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
25fa0 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
25fb0 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
25fc0 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
25fd0 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
25fe0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
25ff0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
26000 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
26010 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
26020 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
26030 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
26040 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
26050 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
26060 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
26070 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
26080 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
26090 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
260a0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
260b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
260c0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
260d0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
260e0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
260f0 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
26100 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
26110 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
26120 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
26130 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
26140 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
26150 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
26160 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
26170 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
26180 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
26190 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
261a0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
261b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
261c0 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
261d0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
261e0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
261f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
26200 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
26210 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
26220 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
26230 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
26240 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
26250 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
26260 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
26270 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
26280 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26290 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
262a0 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
262b0 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
262c0 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
262d0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
262e0 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
262f0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
26300 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
26310 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
26320 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
26330 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
26340 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
26350 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
26360 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
26370 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
26380 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
26390 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
263a0 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
263b0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
263c0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
263d0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
263e0 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
263f0 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
26400 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
26410 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
26420 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
26430 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
26440 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
26450 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
26460 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
26470 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
26480 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
26490 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
264a0 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
264b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
264c0 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
264d0 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
264e0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
264f0 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
26500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
26510 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
26520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26530 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
26540 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
26550 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
26560 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
26570 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
26580 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
26590 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
265a0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
265b0 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
265c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
265d0 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
265e0 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
265f0 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
26600 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
26610 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
26620 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
26630 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
26640 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
26650 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
26660 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
26670 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
26680 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
26690 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
266a0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
266b0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
266c0 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
266d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
266e0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
266f0 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
26700 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
26710 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
26720 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
26730 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26740 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26750 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
26760 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
26770 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
26780 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
26790 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
267a0 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
267b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
267c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
267d0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
267e0 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
267f0 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
26800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26810 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
26820 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d  reference to a m
26830 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26840 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67  e object for pag
26850 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a  e number pgno. .
26860 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
26870 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70  t will use the p
26880 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62  ointer pData, ob
26890 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74  tained from xFet
268a0 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63  ch()..** If succ
268b0 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50  essful, set *ppP
268c0 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  age to point to 
268d0 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66  the new page ref
268e0 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65  erence.** and re
268f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
26900 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
26910 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
26920 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a  r code and set.*
26930 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72  * *ppPage to zer
26940 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65  o..**.** Page re
26950 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65  ferences obtaine
26960 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  d by calling thi
26970 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
26980 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a  d be released.**
26990 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65   by calling page
269a0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
269b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
269c0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
269d0 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  Page(.  Pager *p
269e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
269f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
26a00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e   object */.  Pgn
26a10 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a30 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Page number */. 
26a40 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64   /* xFetch()'d d
26a70 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67  ata for this pag
26a80 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70  e */.  PgHdr **p
26a90 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  pPage           
26aa0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
26ab0 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a  cquired page obj
26ac0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  ect */.){.  PgHd
26ad0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26af0 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26b00 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
26b10 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e   .  if( pPager->
26b20 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
26b30 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26b40 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26b50 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
26b60 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26b70 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
26b80 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
26b90 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   0;.    memset(p
26ba0 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
26bb0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
26bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
26bd0 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
26be0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
26bf0 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
26c00 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
26c10 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
26c20 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26c30 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26c40 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
26c50 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
26c60 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
26c70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26c80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
26c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
26ca0 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
26cb0 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c  &p[1];.    p->fl
26cc0 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50  ags = PGHDR_MMAP
26cd0 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
26ce0 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72  1;.    p->pPager
26cf0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a   = pPager;.  }..
26d00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78    assert( p->pEx
26d10 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b  tra==(void *)&p[
26d20 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1] );.  assert( 
26d30 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  p->pPage==0 );. 
26d40 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
26d50 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b  s==PGHDR_MMAP );
26d60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26d70 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
26d80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
26d90 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67  f==1 );..  p->pg
26da0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e  no = pgno;.  p->
26db0 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
26dc0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26dd0 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  t++;..  return S
26de0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26df0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
26e00 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
26e10 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
26e20 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
26e30 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
26e40 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
26e50 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
26e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26e70 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26e80 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
26e90 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26ea0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
26eb0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26ec0 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
26ed0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
26ee0 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
26ef0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26f00 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
26f10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
26f20 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
26f30 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
26f40 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26f50 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26f60 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
26f70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26f80 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
26f90 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
26fa0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
26fb0 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
26fc0 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
26fd0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
26fe0 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
26ff0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
27000 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
27010 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
27020 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
27030 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
27040 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
27050 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
27060 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
27070 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
27080 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
27090 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
270a0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
270b0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
270c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
270d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
270e0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
270f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
27100 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
27110 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
27120 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
27130 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
27140 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
27150 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
27160 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
27170 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
27180 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
27190 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
271a0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
271b0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
271c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
271d0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
271e0 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
271f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
27200 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
27210 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
27220 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
27230 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
27240 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
27250 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
27260 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
27270 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
27280 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
27290 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
272a0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
272b0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
272c0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
272d0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
272e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
272f0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
27300 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
27310 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
27320 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
27330 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27340 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27350 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
27360 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
27370 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
27380 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
27390 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
273a0 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
273b0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
273c0 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
273d0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
273e0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
273f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
27400 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
27410 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
27420 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
27430 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
27440 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a  ageSize, pTmp);.
27450 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
27460 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
27470 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
27480 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
27490 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
274a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
274b0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
274c0 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
274d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
274e0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
274f0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27500 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
27510 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
27520 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
27530 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
27540 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
27550 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
27560 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
27570 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
27580 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
27590 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
275a0 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
275b0 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
275c0 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
275d0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
275e0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
275f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
27600 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
27610 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
27620 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
27630 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
27640 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
27650 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
27660 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
27670 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
27680 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
27690 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
276a0 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
276b0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
276c0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
276d0 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
276e0 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
276f0 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
27700 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
27710 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
27720 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
27730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27740 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
27750 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27760 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
27770 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
27780 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
27790 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
277a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
277b0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
277c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
277d0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
277e0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
277f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
27800 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
27810 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
27820 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27830 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
27840 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
27850 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
27860 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
27870 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
27880 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27890 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
278a0 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
278b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
278c0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
278d0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
278e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
278f0 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
27900 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
27910 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
27920 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
27930 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
27940 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
27950 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
27960 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
27970 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
27980 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27990 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
279a0 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
279b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
279c0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
279d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
279e0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
279f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
27a00 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
27a10 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
27a20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
27a30 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
27a40 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
27a50 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
27a60 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
27a70 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
27a80 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
27a90 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
27aa0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
27ab0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27ac0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
27ad0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
27ae0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
27af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
27b00 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
27b10 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
27b20 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
27b30 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
27b40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
27b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
27b60 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
27b70 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
27b80 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
27b90 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
27ba0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
27bb0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
27bc0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
27bd0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
27be0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
27bf0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
27c00 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
27c10 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
27c20 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
27c30 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
27c40 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
27c50 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
27c60 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
27c70 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
27c80 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
27c90 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
27ca0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27cb0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
27cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
27cd0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
27ce0 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
27cf0 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
27d00 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
27d10 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27d20 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
27d30 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
27d40 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
27d50 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
27d60 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
27d70 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
27d80 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
27d90 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
27da0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
27db0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
27dc0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
27dd0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
27de0 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
27df0 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
27e00 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
27e10 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
27e20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27e30 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
27e40 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
27e50 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
27e60 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
27e70 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
27e80 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
27e90 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
27ea0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
27eb0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
27ec0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
27ed0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
27ee0 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
27ef0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
27f00 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
27f10 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
27f20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
27f30 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
27f40 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
27f50 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
27f60 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
27f70 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
27f80 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
27f90 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
27fa0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27fb0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
27fc0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
27fd0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
27fe0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
27ff0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
28000 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
28010 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
28020 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
28030 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
28040 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
28050 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
28060 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
28070 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28080 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
28090 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
280a0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
280b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
280c0 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
280d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
280f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28100 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28110 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28120 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
28130 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
28140 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28150 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
28160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
28170 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28180 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
28190 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
281a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
281b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
281c0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
281d0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
281e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
281f0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
28200 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
28210 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
28220 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28230 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
28240 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28250 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
28260 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28270 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28280 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
28290 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
282a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
282b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
282c0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
282d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
282e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
282f0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
28300 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
28310 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
28320 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
28330 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
28340 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
28350 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
28360 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
28370 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
28380 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
28390 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
283a0 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
283b0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
283c0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
283d0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
283e0 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
283f0 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
28400 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
28410 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
28420 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
28430 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
28440 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28450 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
28460 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
28470 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
28480 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
28490 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
284a0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
284b0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
284c0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
284d0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
284e0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
284f0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
28500 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
28510 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
28520 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
28530 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
28540 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28550 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
28560 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
28570 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
28580 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
28590 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
285a0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
285b0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
285c0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
285d0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
285e0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
285f0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
28600 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
28610 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
28620 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
28630 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
28640 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
28650 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
28660 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
28670 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
28680 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
28690 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
286a0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
286b0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
286c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
286d0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
286e0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
286f0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
28700 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
28710 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
28720 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
28730 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
28740 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
28750 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
28760 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
28770 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
28780 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
28790 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
287a0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
287b0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
287c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
287d0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
287e0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
287f0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
28800 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
28810 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
28820 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
28830 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
28840 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
28850 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
28860 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
28870 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
28880 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28890 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
288a0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
288b0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
288c0 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
288d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
288e0 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
288f0 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
28900 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
28910 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
28920 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
28930 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
28940 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28950 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
28960 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
28970 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
28980 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
28990 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
289a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
289b0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
289c0 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
289d0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
289e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
289f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28a00 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
28a10 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
28a20 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
28a30 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
28a40 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
28a50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28a60 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28a70 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
28a80 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
28a90 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28aa0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28ab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
28ac0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
28ad0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
28ae0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28af0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
28b00 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28b10 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
28b20 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
28b30 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
28b40 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
28b50 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
28b60 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
28b70 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
28b80 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
28b90 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
28ba0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
28bb0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
28bc0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
28bd0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
28be0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
28bf0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
28c00 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
28c10 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
28c20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
28c30 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
28c40 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
28c50 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28c60 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
28c70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
28c80 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
28c90 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
28ca0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
28cb0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
28cc0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
28cd0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
28ce0 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
28cf0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
28d00 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
28d10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
28d20 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
28d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
28d40 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
28d50 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
28d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28d70 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
28d80 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
28d90 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
28da0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
28db0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28dc0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28dd0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28de0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28df0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28e00 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28e10 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
28e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28e30 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28e40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
28e90 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
28ea0 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
28eb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28ec0 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
28ed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28ee0 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
28ef0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
28f00 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
28f10 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
28f20 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
28f30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28f60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
28f70 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28f80 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
28f90 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
28fa0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
28fb0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
28fc0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
28fd0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28fe0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
28ff0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
29000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
29010 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
29020 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
29030 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
29040 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29050 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
29060 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
29070 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
29080 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
29090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
290a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
290b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
290c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
290d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
290e0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
290f0 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
29100 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
29110 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
29120 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
29130 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
29140 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
29150 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
29160 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29170 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29180 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
291a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
291b0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
291c0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
291d0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
291e0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
291f0 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
29200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
29210 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
29220 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
29230 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
29240 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
29250 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
29260 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
29270 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
29280 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
29290 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
292a0 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
292b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
292c0 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
292d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
292e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
292f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29310 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
29320 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
29330 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
29340 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
29350 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
29360 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
29370 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
29380 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
29390 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
293a0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
293b0 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
293c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
293d0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
293e0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
293f0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
29400 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
29410 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
29420 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
29430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
29440 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
29450 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
29460 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
29470 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
29480 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
29490 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
294a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
294b0 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
294c0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
294d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
294e0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
294f0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
29500 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
29510 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
29520 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
29530 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
29540 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
29550 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29560 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
29570 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
29580 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
29590 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
295a0 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
295b0 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
295c0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
295d0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
295e0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
295f0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
29600 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
29610 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
29620 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
29630 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
29640 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
29650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29660 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
29670 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
29680 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
29690 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
296a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
296b0 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
296c0 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
296d0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
296e0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
296f0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
29700 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
29710 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
29720 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
29730 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
29740 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
29750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29760 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
29770 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
29780 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
29790 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
297a0 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
297b0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
297c0 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
297d0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
297e0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
297f0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
29800 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
29810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29820 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
29830 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
29840 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
29850 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
29860 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
29870 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
29880 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29890 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
298a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
298b0 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
298c0 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
298d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
298e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
298f0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
29900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
29910 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
29920 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29930 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
29940 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29950 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
29960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
29970 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
29980 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
29990 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
299a0 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
299b0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
299c0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
299d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
299e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
299f0 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
29a00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
29a10 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
29a20 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
29a30 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
29a40 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
29a50 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
29a60 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
29a70 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
29a80 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
29a90 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29aa0 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
29ab0 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
29ac0 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
29ad0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
29ae0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
29af0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
29b00 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
29b10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
29b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
29b30 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
29b40 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
29b50 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
29b60 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
29b70 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
29b80 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
29b90 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
29ba0 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
29bb0 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
29bc0 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
29bd0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
29be0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
29bf0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
29c00 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
29c10 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
29c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29c30 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
29c40 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
29c50 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
29c60 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
29c70 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
29c80 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29c90 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
29ca0 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
29cb0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
29cc0 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
29cd0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
29ce0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
29cf0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
29d00 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
29d10 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
29d20 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
29d30 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
29d40 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
29d50 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
29d60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29d70 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
29d80 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
29d90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
29da0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
29db0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
29dc0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
29dd0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
29de0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
29df0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
29e00 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
29e10 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
29e20 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
29e30 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
29e40 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
29e50 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
29e60 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
29e70 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
29e80 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
29e90 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
29ea0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
29eb0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
29ec0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
29ed0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
29ee0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
29ef0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
29f00 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
29f10 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29f20 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
29f30 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
29f40 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
29f50 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
29f60 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
29f70 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
29f80 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
29f90 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
29fa0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
29fb0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
29fc0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
29fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
2a000 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
2a010 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
2a020 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
2a030 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2a040 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2a050 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
2a060 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
2a070 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
2a080 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
2a090 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2a0a0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2a0b0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
2a0c0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
2a0d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2a0e0 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  PT, pData);..   
2a0f0 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
2a100 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
2a110 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2a120 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2a130 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
2a140 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a150 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
2a160 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
2a170 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
2a180 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
2a190 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
2a1a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
2a1b0 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
2a1c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a1d0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
2a1e0 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
2a1f0 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
2a200 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a210 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
2a220 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
2a230 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
2a240 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
2a250 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2a260 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
2a270 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
2a280 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2a290 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
2a2a0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
2a2b0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2a2c0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2a2d0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
2a2e0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
2a2f0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
2a300 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
2a310 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
2a320 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
2a330 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
2a340 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a350 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
2a360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
2a370 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
2a380 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
2a390 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
2a3a0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
2a3b0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
2a3c0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
2a3d0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2a3f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2a400 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
2a410 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
2a420 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
2a430 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
2a440 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2a450 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2a460 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2a470 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
2a480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
2a490 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
2a4a0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
2a4b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a4c0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
2a4d0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
2a4e0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
2a4f0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
2a500 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
2a510 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a520 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
2a530 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a540 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
2a550 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2a560 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
2a570 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2a580 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
2a590 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2a5a0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
2a5b0 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
2a5c0 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
2a5d0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
2a5e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2a5f0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2a600 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2a610 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2a620 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2a630 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2a640 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2a650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a660 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2a670 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2a680 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2a690 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  gs =  SQLITE_OPE
2a6a0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53  N_SUBJOURNAL | S
2a6b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2a6c0 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51  RITE .      | SQ
2a6d0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2a6e0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   | SQLITE_OPEN_E
2a6f0 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20  XCLUSIVE .      
2a700 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
2a710 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20  LETEONCLOSE;.   
2a720 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20   int nStmtSpill 
2a730 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
2a740 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
2a750 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2a760 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2a770 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2a780 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
2a790 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2a7a0 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20     nStmtSpill = 
2a7b0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  -1;.    }.    rc
2a7c0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2a7d0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  lOpen(pPager->pV
2a7e0 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73  fs, 0, pPager->s
2a7f0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d  jfd, flags, nStm
2a800 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  tSpill);.  }.  r
2a810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a820 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2a830 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2a840 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2a850 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2a860 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49  ournal. .**.** I
2a870 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2a880 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2a890 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2a8a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2a8b0 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2a8c0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2a8d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2a8e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2a8f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2a900 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2a910 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2a920 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2a930 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2a940 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2a950 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2a960 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2a970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2a980 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2a990 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2a9a0 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2a9b0 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2a9c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2a9d0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2a9e0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2a9f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2aa00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2aa10 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2aa20 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2aa30 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2aa40 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2aa50 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2aa60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2aa70 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2aa80 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2aa90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2aaa0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2aab0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2aac0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2aad0 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2aae0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2aaf0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2ab00 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2ab10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2ab20 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2ab30 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2ab40 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2ab50 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2ab60 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2ab70 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2ab80 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2ab90 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2aba0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2abb0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2abc0 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2abd0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2abe0 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2abf0 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2ac00 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2ac10 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2ac20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2ac30 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2ac40 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2ac50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ac60 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2ac70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2ac80 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2ac90 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2aca0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2acb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2acc0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
2acd0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2ace0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2acf0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2ad00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2ad10 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  PT, pData2);.   
2ad20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2ad30 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2ad40 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2ad50 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2ad60 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2ad70 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2ad80 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2ad90 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2ada0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2adb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2adc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2add0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2ade0 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2adf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2ae00 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2ae10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2ae20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ae30 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2ae40 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2ae50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ae60 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2ae70 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2ae80 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2ae90 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2aea0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2aeb0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e   rc;.}.static in
2aec0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2aed0 49 66 52 65 71 75 69 72 65 64 28 50 67 48 64 72  IfRequired(PgHdr
2aee0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75   *pPg){.  if( su
2aef0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2af00 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Pg) ){.    retur
2af10 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  n subjournalPage
2af20 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
2af30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2af40 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
2af50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2af60 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
2af70 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
2af80 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
2af90 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
2afa0 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
2afb0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2afc0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2afd0 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
2afe0 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
2aff0 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
2b000 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
2b010 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
2b020 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
2b030 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
2b040 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
2b050 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
2b060 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
2b070 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
2b080 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
2b090 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2b0a0 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
2b0b0 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
2b0c0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
2b0d0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
2b0e0 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
2b0f0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2b100 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
2b110 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
2b120 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
2b130 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
2b140 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
2b150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b160 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
2b170 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
2b180 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
2b190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
2b1a0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2b1b0 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
2b1c0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2b1d0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
2b1e0 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
2b1f0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2b200 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2b210 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2b220 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
2b230 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
2b240 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2b250 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
2b260 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
2b270 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
2b280 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
2b290 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
2b2a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2b2b0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2b2c0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2b2d0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2b2e0 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
2b2f0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
2b300 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
2b310 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
2b320 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2b330 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
2b340 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
2b350 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2b360 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
2b370 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
2b380 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
2b390 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
2b3a0 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    /* The doNotSp
2b3b0 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69  ill NOSYNC bit i
2b3c0 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
2b3d0 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
2b3e0 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
2b3f0 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
2b400 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
2b410 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
2b420 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
2b430 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
2b440 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b450 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
2b460 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
2b470 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
2b480 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
2b490 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
2b4a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
2b4b0 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b  otSpill ROLLBACK
2b4c0 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e   and OFF bits in
2b4d0 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
2b4e0 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72   spilling.  ** r
2b4f0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2b500 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79  ther or not a sy
2b510 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
2b520 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
2b530 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  ing.  ** a rollb
2b540 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72  ack or by user r
2b550 65 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69  equest, respecti
2b560 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  vely..  **.  ** 
2b570 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
2b580 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
2b590 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2b5a0 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
2b5b0 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
2b5c0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
2b5d0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
2b5e0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
2b5f0 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69  ation it .  ** i
2b600 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2b610 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2b620 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c  tch() to be call
2b630 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  ed with createFl
2b640 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65  ag==3.  ** while
2b650 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2b660 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73  ate, hence it is
2b670 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2b680 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2b690 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69    ** be called i
2b6a0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b6b0 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  e.  Nevertheless
2b6c0 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e  , we include a N
2b6d0 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74  EVER().  ** test
2b6e0 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73   for the error s
2b6f0 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75  tate as a safegu
2b700 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75  ard against futu
2b710 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  re changes..  */
2b720 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2b730 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2b740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b750 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2b760 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b770 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
2b780 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63  LBACK );.  testc
2b790 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b7a0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b7b0 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73  LAG_OFF );.  tes
2b7c0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2b7d0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2b7e0 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a  LFLAG_NOSYNC );.
2b7f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2b800 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28  NotSpill.   && (
2b810 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
2b820 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47  ill & (SPILLFLAG
2b830 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46  _ROLLBACK|SPILLF
2b840 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20  LAG_OFF))!=0.   
2b850 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
2b860 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
2b870 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20  YNC)!=0).  ){.  
2b880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b890 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
2b8a0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2b8b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2b8c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2b8d0 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2b8e0 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2b8f0 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2b900 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  /.    rc = subjo
2b910 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2b920 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69  red(pPg); .    i
2b930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b940 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2b950 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2b960 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2b970 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2b980 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
2b990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b9a0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2b9b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
2b9c0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2b9d0 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
2b9e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2b9f0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2ba00 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
2ba10 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2ba20 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2ba30 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
2ba40 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2ba50 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
2ba60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2ba70 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2ba80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2baa0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2bab0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2bac0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2bad0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2bae0 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
2baf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2bb00 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
2bb10 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
2bb20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb30 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2bb40 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
2bb50 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2bb60 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2bb70 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
2bb80 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2bb90 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
2bba0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2bbb0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
2bbc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
2bbd0 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64  all unreferenced
2bbe0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2bbf0 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
2bc00 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50  ite3PagerFlush(P
2bc10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2bc20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
2bc30 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
2bc40 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50   !MEMDB ){.    P
2bc50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
2bc60 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2bc70 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2bc80 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ache);.    asser
2bc90 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2bca0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2bcb0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2bcc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2bcd0 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  st ){.      PgHd
2bce0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
2bcf0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
2bd00 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d  if( pList->nRef=
2bd10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2bd20 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28   = pagerStress((
2bd30 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c  void*)pPager, pL
2bd40 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
2bd50 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
2bd60 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2bd70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bd80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2bd90 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2bda0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2bdb0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2bdc0 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2bdd0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2bde0 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2bdf0 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2be00 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2be10 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2be20 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2be30 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2be40 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2be50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2be60 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2be70 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2be80 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2be90 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2bea0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2beb0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2bec0 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2bed0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2bee0 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2bef0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2bf00 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2bf10 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2bf20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2bf30 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2bf40 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2bf50 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2bf60 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2bf70 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2bf80 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2bf90 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2bfa0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2bfb0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2bfc0 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2bfd0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2bfe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2bff0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2c000 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2c010 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2c020 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2c030 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2c040 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2c050 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2c060 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2c070 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
2c080 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2c090 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2c0a0 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2c0b0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2c0c0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2c0d0 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2c0e0 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2c0f0 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2c100 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2c110 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2c120 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2c130 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2c140 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2c150 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2c160 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2c170 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2c180 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2c190 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2c1a0 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2c1b0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2c1c0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2c1d0 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2c1e0 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2c1f0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2c200 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2c210 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2c220 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2c230 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2c240 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2c250 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2c260 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2c270 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2c280 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2c290 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2c2a0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2c2b0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2c2c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2c2d0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2c2e0 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2c2f0 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2c300 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2c310 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2c320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2c330 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2c340 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2c350 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2c360 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2c370 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2c380 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2c390 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2c3a0 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2c3b0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2c3c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2c3d0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2c3e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2c3f0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2c400 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c420 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2c430 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2c440 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2c450 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2c460 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2c470 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2c480 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2c490 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2c4a0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2c4b0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2c4c0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2c4d0 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2c4e0 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2c4f0 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2c500 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2c510 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2c520 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2c530 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2c540 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2c550 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2c560 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2c570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c580 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2c590 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2c5a0 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2c5b0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2c5c0 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2c5d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2c5e0 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2c5f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c600 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2c610 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2c620 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2c630 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2c640 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2c650 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2c660 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2c670 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2c680 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2c690 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2c6a0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2c6b0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2c6c0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2c6d0 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2c6e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2c6f0 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2c700 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c710 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2c720 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2c730 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2c740 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2c750 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2c760 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2c770 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2c780 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2c790 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2c7a0 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2c7b0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c7c0 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2c7d0 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2c7e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2c7f0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2c800 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2c810 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c820 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2c830 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2c840 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2c850 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2c860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c870 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2c880 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2c890 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2c8a0 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2c8b0 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2c8c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2c8d0 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2c8e0 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2c8f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2c900 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2c910 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75  rnal).  */.  jou
2c920 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2c930 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2c940 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2c950 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2c960 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2c970 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2c980 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2c990 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2c9a0 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2c9b0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2c9c0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2c9d0 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2c9e0 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2c9f0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2ca00 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2ca10 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  ){.      zPathna
2ca20 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
2ca30 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d  rDup(0, zFilenam
2ca40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  e);.      if( zP
2ca50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65  athname==0  ) re
2ca60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ca70 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50  M_BKPT;.      nP
2ca80 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2ca90 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2caa0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  ame);.      zFil
2cab0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
2cac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2cad0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2cae0 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2caf0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2cb00 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2cb10 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2cb20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2cb30 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2cb40 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2cb50 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2cb60 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2cb70 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2cb80 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2cb90 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2cba0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2cbb0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2cbc0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2cbd0 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2cbe0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2cbf0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2cc00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2cc10 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32  w(0, nPathname*2
2cc20 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2cc30 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2cc40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cc50 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2cc60 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
2cc70 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
2cc80 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
2cc90 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
2cca0 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
2ccb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ccc0 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
2ccd0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
2cce0 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
2ccf0 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
2cd00 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2cd10 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2cd20 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20  );.    z = zUri 
2cd30 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c  = &zFilename[sql
2cd40 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
2cd50 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20  lename)+1];.    
2cd60 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2cd70 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2cd80 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2cd90 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2cda0 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2cdb0 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20     }.    nUri = 
2cdc0 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55  (int)(&z[1] - zU
2cdd0 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ri);.    assert(
2cde0 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20   nUri>=0 );.    
2cdf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ce00 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2ce10 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2ce20 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2ce30 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2ce40 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2ce50 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2ce60 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2ce70 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2ce80 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2ce90 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2cea0 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2ceb0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2cec0 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2ced0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2cee0 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2cef0 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2cf00 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2cf10 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2cf20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2cf30 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2cf40 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2cf50 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2cf60 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2cf70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2cf80 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2cf90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2cfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cfb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2cfc0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2cfd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2cfe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2cff0 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2d000 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2d010 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2d020 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2d030 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2d040 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2d050 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2d060 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2d070 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2d080 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2d090 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2d0a0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2d0b0 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2d0c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2d0d0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2d0e0 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2d0f0 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2d100 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2d110 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2d120 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2d130 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2d140 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2d150 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2d160 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2d170 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2d180 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2d190 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2d1a0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2d1b0 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2d1c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2d1d0 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2d1e0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2d1f0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2d200 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2d210 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2d220 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2d230 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2d240 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2d250 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d260 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2d270 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2d280 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2d290 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2d2a0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2d2b0 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2d2c0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2d2d0 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2d2e0 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2d2f0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2d300 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2d310 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2d320 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2d330 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2d340 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2d350 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2d360 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2d370 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2d380 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2d390 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2d3a0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2d3b0 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2d3c0 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 8 + 2         
2d3d0 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2d3e0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2d3f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2d400 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2d410 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f  + 2            /
2d420 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2d430 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2d440 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d450 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2d460 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2d470 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2d480 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2d490 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2d4a0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2d4b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d4c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
2d4d0 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
2d4e0 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
2d4f0 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
2d500 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
2d510 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
2d520 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2d530 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
2d540 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
2d550 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2d560 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
2d570 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
2d580 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
2d590 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d5a0 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2d5b0 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
2d5c0 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
2d5d0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2d5e0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2d5f0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
2d600 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
2d610 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
2d620 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2d630 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2d640 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
2d650 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
2d660 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2d670 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
2d680 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
2d690 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
2d6a0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
2d6b0 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
2d6c0 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68     assert( nPath
2d6d0 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50  name>0 );.    pP
2d6e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
2d6f0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2d700 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
2d710 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65   + nUri);.    me
2d720 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
2d730 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
2d740 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d750 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65     if( nUri ) me
2d760 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2d770 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2d780 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2d790 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2d7a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2d7b0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d7c0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d7d0 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2d7e0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2d7f0 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20  "-journal\000", 
2d800 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  8+2);.    sqlite
2d810 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2d820 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d830 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d840 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2d850 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2d860 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2d870 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2d880 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2d890 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d8a0 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2d8b0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d8c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d8d0 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2d8e0 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c  me], "-wal\000",
2d8f0 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   4+1);.    sqlit
2d900 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2d910 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d920 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2d930 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2d940 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d950 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2d960 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2d970 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2d980 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2d990 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2d9a0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2d9b0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2d9c0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2d9d0 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2d9e0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2d9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2da00 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2da10 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2da20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2da30 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2da40 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2da50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2da60 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2da70 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2da80 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2da90 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2daa0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
2dab0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
2dac0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
2dad0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
2dae0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
2daf0 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
2db00 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2db10 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
2db20 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
2db30 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2db40 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
2db50 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
2db60 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
2db70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2db80 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
2db90 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
2dba0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
2dbb0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
2dbc0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
2dbd0 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
2dbe0 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
2dbf0 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
2dc00 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
2dc10 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
2dc20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dc30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2dc40 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2dc50 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2dc60 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2dc70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65  );.      if( !re
2dc80 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2dc90 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2dca0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
2dcb0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44   assert(SQLITE_D
2dcc0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dcd0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2dce0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
2dcf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
2dd00 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2dd10 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2dd20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2dd30 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
2dd40 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2dd50 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
2dd60 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2dd70 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
2dd80 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2dd90 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20  SIZE;.          
2dda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ddb0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2ddc0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2ddd0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2dde0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2ddf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2de00 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2de10 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2de20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2de30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2de40 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2de50 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
2de60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2de70 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2de80 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2de90 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2dea0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2deb0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2dec0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2ded0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2dee0 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2def0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2df00 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2df10 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2df20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2df30 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2df40 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2df50 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2df60 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
2df70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2df80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2df90 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
2dfa0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2dfb0 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ck = sqlite3_uri
2dfc0 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2dfd0 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29  me, "nolock", 0)
2dfe0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63  ;.      if( (iDc
2dff0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
2e000 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20  IMMUTABLE)!=0.  
2e010 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
2e020 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2e030 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c  ename, "immutabl
2e040 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  e", 0) ){.      
2e050 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20      vfsFlags |= 
2e060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e070 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20  ONLY;.          
2e080 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65  goto act_like_te
2e090 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d  mp_file;.      }
2e0a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2e0b0 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
2e0c0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
2e0d0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
2e0e0 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
2e0f0 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
2e100 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
2e110 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
2e120 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
2e130 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
2e140 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
2e150 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
2e160 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
2e170 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
2e180 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2e190 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
2e1a0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2e1b0 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
2e1c0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
2e1d0 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
2e1e0 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
2e1f0 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
2e200 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
2e210 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
2e220 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
2e230 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2e240 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
2e250 20 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73   This branch als
2e260 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73  o runs for files
2e270 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74   marked as immut
2e280 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63  able..    */ .ac
2e290 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2e2a0 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  :.    tempFile =
2e2b0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2e2c0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2e2d0 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72  EADER;     /* Pr
2e2e0 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79  etend we already
2e2f0 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a   have a lock */.
2e300 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
2e310 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  k = EXCLUSIVE_LO
2e320 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  CK;    /* Preten
2e330 64 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c  d we are in EXCL
2e340 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20  USIVE mode */.  
2e350 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2e360 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2e370 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f       /* Do no lo
2e380 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61  cking */.    rea
2e390 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67  dOnly = (vfsFlag
2e3a0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
2e3b0 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20  ADONLY);.  }..  
2e3c0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2e3d0 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65   call to PagerSe
2e3e0 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76  tPagesize() serv
2e3f0 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61  es to set the va
2e400 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67  lue of .  ** Pag
2e410 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20  er.pageSize and 
2e420 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
2e430 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
2e440 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
2e450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e460 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e470 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
2e480 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2e490 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
2e4a0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a  size(pPager, &sz
2e4b0 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20  PageDflt, -1);. 
2e4c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
2e4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2e4e0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2e4f0 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2e500 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ject. */.  if( r
2e510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e520 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
2e530 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e  ra<1000 );.    n
2e540 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
2e550 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d  Extra);.    rc =
2e560 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2e570 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2e580 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5a0 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2e5b0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2e5c0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2e5d0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e5e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2e5f0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ror occurred abo
2e600 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61  ve, free the  Pa
2e610 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2e620 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2e630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2e640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e650 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2e660 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2e670 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2e680 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
2e690 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
2e6a0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2e6b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e6c0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2e6d0 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2e6e0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2e6f0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2e700 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2e710 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2e720 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2e730 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2e740 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2e750 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2e760 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2e770 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e780 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2e790 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2e7a0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2e7b0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2e7c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e7d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2e7e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e7f0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2e800 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e810 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2e820 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2e830 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2e840 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2e850 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2e860 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
2e870 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2e880 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2e890 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2e8a0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2e8b0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2e8c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2e8d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2e8e0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2e8f0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2e900 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2e910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2e920 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2e930 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2e940 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2e950 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2e960 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2e970 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2e980 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2e990 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2e9a0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2e9b0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2e9c0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2e9d0 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2e9e0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2e9f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2ea00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2ea10 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2ea20 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
2ea30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2ea40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ea50 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29  r->fullSync==0 )
2ea60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ea70 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d  ager->extraSync=
2ea80 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ea90 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2eaa0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2eab0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2eac0 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2ead0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2eae0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2eaf0 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  gs==0 );.  }else
2eb00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  {.    pPager->fu
2eb10 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 23 69 66 20  llSync = 1;.#if 
2eb20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55 52  SQLITE_EXTRA_DUR
2eb30 41 42 4c 45 0a 20 20 20 20 70 50 61 67 65 72 2d  ABLE.    pPager-
2eb40 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 31 3b 0a  >extraSync = 1;.
2eb50 23 65 6c 73 65 0a 20 20 20 20 70 50 61 67 65 72  #else.    pPager
2eb60 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
2eb70 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
2eb80 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2eb90 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2eba0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
2ebb0 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  walSyncFlags = S
2ebc0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ebd0 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41  L | WAL_SYNC_TRA
2ebe0 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70  NSACTIONS;.    p
2ebf0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2ec00 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2ec10 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
2ec20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2ec30 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
2ec40 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
2ec50 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
2ec60 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
2ec70 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ec80 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
2ec90 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
2eca0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
2ecb0 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
2ecc0 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
2ecd0 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
2ece0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2ecf0 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
2ed00 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
2ed10 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
2ed20 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
2ed30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2ed40 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2ed50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2ed60 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
2ed70 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
2ed80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2ed90 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2eda0 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
2edb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
2edc0 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
2edd0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2ede0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
2edf0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2ee00 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
2ee10 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  init;.  /* memse
2ee20 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
2ee30 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
2ee40 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
2ee50 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d   /* pPager->szMm
2ee60 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
2ee70 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f  ULT_MMAP_SIZE //
2ee80 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20   will be set by 
2ee90 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70  btree.c */..  *p
2eea0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
2eeb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2eec0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69  _OK;.}.../* Veri
2eed0 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
2eee0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
2eef0 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  t be deleted or 
2ef00 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d  renamed out from
2ef10 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61  .** under the pa
2ef20 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ger.  Return SQL
2ef30 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61  ITE_OK if the da
2ef40 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20  tabase is still 
2ef50 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a  were it ought.**
2ef60 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20   to be on disk. 
2ef70 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
2ef80 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   (SQLITE_READONL
2ef90 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d  Y_DBMOVED or som
2efa0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  e other error.**
2efb0 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
2efc0 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66  e3OsAccess()) if
2efd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2efe0 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a  s gone missing..
2eff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
2f000 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
2f010 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2f020 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20    int bHasMoved 
2f030 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
2f040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
2f050 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  mpFile ) return 
2f060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2f070 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
2f080 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2f090 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
2f0a0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f0b0 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46  me && pPager->zF
2f0c0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  ilename[0] );.  
2f0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
2f0e0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
2f0f0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
2f100 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62  TL_HAS_MOVED, &b
2f110 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28  HasMoved);.  if(
2f120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
2f130 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OUND ){.    /* I
2f140 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20  f the HAS_MOVED 
2f150 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20  file-control is 
2f160 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61  unimplemented, a
2f170 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
2f180 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ile.    ** has n
2f190 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20  ot been moved.  
2f1a0 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74  That is the hist
2f1b0 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20  orical behavior 
2f1c0 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72  of SQLite: prior
2f1d0 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   to.    ** versi
2f1e0 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76  on 3.8.3, it nev
2f1f0 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  er checked */.  
2f200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f210 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
2f220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2f230 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  HasMoved ){.    
2f240 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
2f250 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20  ONLY_DBMOVED;.  
2f260 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f270 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2f280 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2f290 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
2f2a0 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
2f2b0 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
2f2c0 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
2f2d0 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
2f2e0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2f2f0 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
2f300 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
2f310 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
2f320 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
2f330 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
2f340 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
2f350 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
2f360 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
2f370 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
2f380 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
2f390 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
2f3a0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2f3b0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
2f3c0 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
2f3d0 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
2f3e0 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
2f3f0 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
2f400 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2f410 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
2f420 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2f430 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
2f440 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2f450 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2f460 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2f470 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
2f480 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2f490 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
2f4a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f4b0 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
2f4c0 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
2f4d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
2f4e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2f4f0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
2f500 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
2f510 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
2f520 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
2f530 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
2f540 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
2f550 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
2f560 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
2f570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2f580 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f590 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
2f5a0 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
2f5b0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2f5c0 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
2f5d0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2f5e0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
2f5f0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
2f600 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
2f610 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
2f620 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
2f630 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2f640 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2f650 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
2f660 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2f670 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
2f680 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
2f690 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2f6a0 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
2f6b0 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
2f6c0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2f6d0 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
2f6e0 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
2f6f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
2f700 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
2f710 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
2f720 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f730 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
2f740 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
2f750 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
2f760 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
2f770 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
2f780 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
2f790 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2f7a0 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
2f7b0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2f7c0 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
2f7d0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
2f7e0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
2f7f0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f800 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f810 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2f820 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2f830 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
2f840 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2f850 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
2f860 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
2f870 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
2f880 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2f890 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2f8a0 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
2f8b0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2f8c0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
2f8d0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2f8e0 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
2f8f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
2f900 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2f910 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
2f920 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f930 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
2f940 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2f950 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f970 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
2f980 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f990 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
2f9a0 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
2f9b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
2f9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f9d0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2f9e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2f9f0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2fa00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fa10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2fa20 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
2fa30 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
2fa40 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
2fa50 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2fa60 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
2fa70 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
2fa80 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
2fa90 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
2faa0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
2fab0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2fac0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2fad0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
2fae0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2faf0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
2fb00 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
2fb10 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
2fb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2fb30 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
2fb40 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
2fb50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2fb60 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
2fb70 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2fb80 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
2fb90 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
2fba0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
2fbb0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
2fbc0 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
2fbd0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
2fbe0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
2fbf0 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
2fc00 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
2fc10 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
2fc20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
2fc30 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
2fc40 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
2fc50 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
2fc60 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
2fc70 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
2fc80 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
2fc90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2fca0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
2fcb0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
2fcc0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
2fcd0 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
2fce0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2fcf0 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
2fd00 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
2fd10 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
2fd20 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
2fd30 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
2fd40 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2fd50 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
2fd60 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
2fd70 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
2fd80 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
2fd90 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
2fda0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
2fdb0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
2fdc0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2fdd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
2fde0 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
2fdf0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
2fe00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2fe10 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2fe20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2fe30 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
2fe40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2fe50 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2fe60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fe70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fe80 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2fe90 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73  se is zero pages
2fea0 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d   in size, that m
2feb0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
2fec0 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20   (1) the.       
2fed0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61   ** journal is a
2fee0 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20   remnant from a 
2fef0 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77  prior database w
2ff00 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2ff10 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20  e where.        
2ff20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2ff30 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65  file but not the
2ff40 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c   journal was del
2ff50 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65  eted, or (2) the
2ff60 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20   initial.       
2ff70 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
2ff80 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61  that populates a
2ff90 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
2ffa0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
2ffb0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
2ffc0 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
2ffd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ffe0 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
2fff0 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63   However, take c
30000 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  are.        ** n
30010 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ot to delete the
30020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
30030 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
30040 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20  pen due to.     
30050 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f     ** journal_mo
30060 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20  de=PERSIST..    
30070 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
30080 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21  f( nPage==0 && !
30090 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
300a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
300b0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
300c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
300d0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
300e0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
300f0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
30100 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
30110 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
30120 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
30130 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
30140 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
30150 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
30160 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
30170 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
30180 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
30190 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
301a0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
301b0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
301c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
301d0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
301e0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
301f0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
30200 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
30210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
30220 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
30230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30240 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
30250 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
30260 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
30270 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
30280 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
30290 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
302a0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
302b0 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
302c0 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
302d0 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
302e0 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
302f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
30300 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
30310 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
30320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
30330 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30340 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
30350 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
30360 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
30370 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
30380 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30390 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
303a0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
303b0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
303c0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
303d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
303e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
303f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30400 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
30410 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30420 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
30430 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
30440 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
30450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
30470 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
30480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
30490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
304a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
304b0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
304c0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
304d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
304e0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
304f0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
30500 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
30510 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
30520 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
30530 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
30540 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
30550 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30560 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
30570 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
30580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
30590 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
305a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
305b0 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
305c0 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
305d0 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
305e0 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
305f0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
30600 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
30610 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
30620 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
30630 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
30640 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
30650 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
30660 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
30670 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
30680 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
30690 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
306a0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
306b0 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
306c0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
306d0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
306e0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
306f0 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
30700 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
30710 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
30720 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
30730 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
30740 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
30750 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
30760 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
30770 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
30780 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
30790 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
307a0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
307b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
307c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
307d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
307e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
307f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
30800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30820 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
30830 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
30840 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30850 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
30860 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
30870 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30880 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
30890 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
308a0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
308b0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
308c0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
308d0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
308e0 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
308f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
30900 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
30910 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
30920 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
30930 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
30940 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
30950 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
30960 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
30970 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
30980 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
30990 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
309a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
309b0 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
309c0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
309d0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
309e0 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
309f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30a00 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
30a10 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
30a20 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
30a30 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
30a40 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
30a50 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
30a60 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
30a70 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
30a80 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
30a90 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
30aa0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
30ab0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
30ac0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30ad0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
30ae0 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
30af0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
30b00 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
30b10 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
30b20 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
30b30 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
30b40 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
30b50 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
30b60 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
30b70 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
30b80 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
30b90 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
30ba0 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
30bb0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
30bc0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
30bd0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
30be0 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
30bf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
30c00 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
30c10 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
30c20 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
30c30 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
30c40 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
30c50 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
30c60 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
30c70 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
30c80 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
30c90 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
30ca0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
30cb0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
30cc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
30cd0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30ce0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
30cf0 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
30d00 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
30d10 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
30d20 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
30d30 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
30d40 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
30d50 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
30d60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30d80 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
30d90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30da0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30db0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
30dc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30dd0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
30de0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
30df0 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
30e00 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
30e10 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
30e20 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
30e30 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
30e40 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
30e50 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
30e60 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
30e70 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
30e80 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
30e90 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
30ea0 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
30eb0 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
30ec0 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20  e access mode.. 
30ed0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
30ee0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
30ef0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
30f00 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
30f10 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30f20 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30f40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30f50 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
30f60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30f70 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28  _READER );.  if(
30f80 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
30f90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
30fa0 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
30fb0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
30fc0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
30fd0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
30fe0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30ff0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
31000 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
31010 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
31020 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
31030 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
31040 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
31050 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
31060 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
31070 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
31080 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31090 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
310a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
310b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
310c0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
310d0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
310e0 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
310f0 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
31100 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
31110 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
31120 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
31130 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
31140 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
31150 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
31160 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
31170 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
31180 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
31190 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
311a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
311b0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
311c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
311d0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
311e0 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
311f0 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
31200 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31220 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31230 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
31240 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
31250 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
31260 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
31270 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
31280 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
31290 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
312a0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
312b0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
312c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
312d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
312e0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
312f0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
31300 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
31310 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
31320 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
31330 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
31340 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
31350 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
31360 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
31370 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
31380 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31390 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
313a0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
313b0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
313c0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
313d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
313e0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
313f0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31400 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
31410 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
31420 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
31430 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
31440 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
31450 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
31460 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
31470 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
31480 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
31490 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
314a0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
314b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
314c0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
314d0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
314e0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
314f0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
31500 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
31510 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
31520 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31530 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
31540 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
31550 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
31560 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
31570 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
31580 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
31590 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
315a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
315b0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
315c0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
315d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
315e0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
315f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31620 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31630 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
31640 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
31650 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
31660 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
31670 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
31680 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31690 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
316a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
316b0 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
316c0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
316d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
316e0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
316f0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31700 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31710 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31720 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31730 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
31740 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
31750 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
31760 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
31770 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
31780 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
31790 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
317a0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
317b0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
317c0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
317d0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
317e0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
317f0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
31800 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31810 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
31820 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
31830 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
31840 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
31850 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
31860 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
31870 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
31880 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
31890 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
318a0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
318b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
318c0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
318d0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
318e0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
318f0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
31900 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
31910 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
31920 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
31930 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31940 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
31950 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31960 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
31970 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31980 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
31990 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
319a0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
319b0 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
319c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
319d0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
319e0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
319f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31a00 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
31a10 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
31a20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31a30 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
31a40 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
31a50 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
31a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31a70 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
31a80 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
31a90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
31aa0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
31ab0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
31ac0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31ad0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31ae0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
31af0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
31b00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31b10 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31b20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31b30 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31b40 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
31b50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31b60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
31b70 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31b80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
31b90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31ba0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
31bb0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31bd0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
31be0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
31bf0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
31c00 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
31c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31c20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
31c30 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
31c40 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
31c50 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
31c60 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
31c70 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
31c80 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
31c90 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
31ca0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
31cb0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
31cc0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
31cd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
31ce0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
31cf0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
31d00 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
31d10 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
31d20 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
31d30 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
31d40 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
31d50 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
31d60 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
31d70 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
31d80 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
31d90 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
31da0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
31db0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
31dc0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
31dd0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31de0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
31df0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
31e00 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
31e10 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31e20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31e40 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31e50 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
31e60 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
31e70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31e80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31e90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
31ea0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
31eb0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
31ec0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31ed0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
31ee0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
31ef0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
31f00 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
31f10 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
31f20 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31f30 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31f40 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
31f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31f60 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
31f70 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
31f80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31f90 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
31fa0 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
31fb0 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
31fc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
31fd0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
31fe0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
31ff0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
32000 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
32010 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
32020 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
32030 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
32040 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
32050 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
32060 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
32070 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
32080 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
32090 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
320a0 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
320b0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
320c0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
320d0 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
320e0 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
320f0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
32100 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
32110 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
32120 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
32130 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
32140 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
32150 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
32160 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
32170 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
32180 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
32190 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
321a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
321b0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
321c0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
321d0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
321e0 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
321f0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
32200 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
32210 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
32220 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
32230 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
32240 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
32250 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
32260 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
32270 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
32280 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
32290 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
322a0 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
322b0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
322c0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
322d0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
322e0 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
322f0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
32300 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
32310 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
32320 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
32330 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
32340 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
32350 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
32360 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
32370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
32380 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32390 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
323a0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
323b0 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
323c0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
323d0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
323e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
323f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
32400 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32410 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
32420 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
32430 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
32440 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32450 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
32460 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
32470 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
32480 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
32490 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
324a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
324b0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
324c0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
324d0 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
324e0 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
324f0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
32500 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32510 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
32520 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
32530 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
32540 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
32550 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
32560 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
32570 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
32580 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
32590 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
325a0 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
325b0 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
325c0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
325d0 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
325e0 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
325f0 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
32600 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
32610 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
32620 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
32630 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
32640 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
32650 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
32660 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
32670 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
32680 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
32690 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
326a0 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
326b0 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
326c0 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
326d0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
326e0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
326f0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32700 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
32710 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
32720 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
32730 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
32740 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
32750 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
32760 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
32770 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
32780 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
32790 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
327a0 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
327b0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
327c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
327d0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
327e0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
327f0 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
32800 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
32810 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
32820 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
32830 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
32840 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
32850 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
32860 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
32870 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
32880 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32890 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
328a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
328b0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
328c0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
328d0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
328e0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
328f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
32900 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
32910 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
32920 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
32930 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
32940 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32950 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
32960 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
32970 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32980 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32990 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
329a0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
329b0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
329c0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
329d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
329e0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
329f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
32a00 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
32a10 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
32a20 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
32a30 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
32a40 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
32a50 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
32a60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32a70 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
32a80 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
32a90 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
32aa0 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
32ab0 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
32ac0 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
32ad0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
32ae0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
32af0 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
32b00 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
32b10 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
32b20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
32b30 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
32b40 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
32b50 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
32b60 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
32b70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
32b80 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
32b90 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
32ba0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
32bb0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
32bc0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
32bd0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
32be0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
32bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
32c00 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
32c10 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
32c20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
32c30 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
32c40 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
32c50 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
32c60 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
32c70 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
32c80 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
32c90 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
32ca0 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
32cb0 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
32cc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
32cd0 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
32ce0 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
32cf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32d00 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
32d10 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
32d20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
32d30 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32d40 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
32d50 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
32d60 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32d70 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
32d80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32d90 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
32da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32db0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
32dc0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
32dd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
32de0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
32df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32e00 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
32e10 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
32e20 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
32e30 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
32e40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32e50 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
32e70 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
32e80 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
32e90 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
32ea0 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
32eb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
32ec0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
32ed0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
32ee0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
32ef0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
32f00 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
32f10 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
32f20 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
32f30 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
32f40 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
32f50 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
32f60 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
32f70 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
32f80 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
32f90 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
32fa0 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
32fb0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
32fc0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
32fd0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
32fe0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
32ff0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
33000 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
33010 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
33020 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d  ager->nMmapOut==
33030 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61  0 && (sqlite3Pca
33040 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
33050 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
33060 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
33070 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
33080 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
33090 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
330a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
330b0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
330c0 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
330d0 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
330e0 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
330f0 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
33100 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
33110 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
33120 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
33130 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
33140 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
33150 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
33160 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
33170 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
33180 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
33190 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
331a0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
331b0 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
331c0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
331d0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
331e0 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
331f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33200 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
33210 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
33220 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
33230 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
33240 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
33250 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
33260 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
33270 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
33280 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
33290 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
332a0 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
332b0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
332c0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
332d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
332e0 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
332f0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
33300 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
33310 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
33320 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
33330 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
33340 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
33350 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
33360 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
33370 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
33380 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
33390 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
333a0 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
333b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
333c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
333d0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
333e0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
333f0 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
33400 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
33410 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
33420 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
33430 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
33440 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
33450 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
33460 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
33470 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
33480 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
33490 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
334a0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
334b0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
334c0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
334d0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
334e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
334f0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
33500 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
33510 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
33520 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
33530 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
33540 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
33550 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
33560 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
33570 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
33580 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
33590 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
335a0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
335b0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
335c0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
335d0 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
335e0 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
335f0 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
33600 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
33610 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
33620 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
33630 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
33640 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
33650 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
33660 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
33670 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
33680 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
33690 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
336a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
336b0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
336c0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
336d0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
336e0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
336f0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
33700 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
33710 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
33720 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
33730 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
33740 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
33750 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
33760 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
33770 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
33780 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
33790 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
337a0 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
337b0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
337c0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
337d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
337e0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
337f0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
33800 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
33810 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
33820 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
33830 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
33840 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
33850 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
33860 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
33870 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
33880 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
33890 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
338a0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
338b0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
338c0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
338d0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
338e0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
338f0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
33900 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
33910 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
33920 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
33930 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
33940 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
33950 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
33960 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
33970 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
33980 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
33990 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
339a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
339b0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
339c0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
339d0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
339e0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
339f0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
33a00 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
33a10 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
33a20 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
33a30 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
33a40 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
33a50 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
33a60 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
33a70 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
33a80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  t sqlite3PagerGe
33a90 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  t(.  Pager *pPag
33aa0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
33ab0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
33ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33ad0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
33ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
33af0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
33b00 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
33b10 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
33b20 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
33b30 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
33b40 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
33b50 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
33b60 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
33b70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
33b80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
33b90 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33  r *pPg = 0;.  u3
33ba0 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
33bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33bc0 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
33bd0 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
33be0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f    const int noCo
33bf0 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26  ntent = (flags &
33c00 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
33c10 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20  TENT);..  /* It 
33c20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f  is acceptable to
33c30 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79   use a read-only
33c40 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72   (mmap) page for
33c50 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74   any page except
33c60 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20  .  ** page 1 if 
33c70 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74  there is no writ
33c80 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
33c90 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52  en or the ACQUIR
33ca0 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  E_READONLY.  ** 
33cb0 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
33cc0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
33cd0 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73  . And so long as
33ce0 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61   the db is not a
33cf0 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
33d00 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   or in-memory da
33d10 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f  tabase.  */.  co
33d20 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20  nst int bMmapOk 
33d30 3d 20 28 70 67 6e 6f 3e 31 20 26 26 20 55 53 45  = (pgno>1 && USE
33d40 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20  FETCH(pPager).  
33d50 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
33d60 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33d70 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41  R || (flags & PA
33d80 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
33d90 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  )).#ifdef SQLITE
33da0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26  _HAS_CODEC.   &&
33db0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
33dc0 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a  =0.#endif.  );..
33dd0 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f    /* Optimizatio
33de0 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20  n note:  Adding 
33df0 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65  the "pgno<=1" te
33e00 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d  rm before "pgno=
33e10 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c  =0" here.  ** al
33e20 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lows the compile
33e30 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72  r optimizer to r
33e40 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73  euse the results
33e50 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22   of the "pgno>1"
33e60 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68  .  ** test in th
33e70 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65  e previous state
33e80 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20  ment, and avoid 
33e90 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20  testing pgno==0 
33ea0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d  in the.  ** comm
33eb0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67  on case where pg
33ec0 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a  no is large. */.
33ed0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26    if( pgno<=1 &&
33ee0 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
33ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
33f00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
33f10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33f20 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
33f30 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
33f40 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
33f50 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
33f60 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f  ;.  assert( noCo
33f70 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61  ntent==0 || bMma
33f80 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73  pOk==0 );..  ass
33f90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73  ert( pPager->has
33fa0 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d  HeldSharedLock==
33fb0 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  1 );..  /* If th
33fc0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
33fd0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
33fe0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
33ff0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
34000 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
34010 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
34020 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
34030 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
34040 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
34050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34060 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
34070 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
34080 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
34090 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
340a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
340b0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
340c0 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
340d0 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
340e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
340f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34100 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34110 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
34120 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
34130 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  & iFrame==0 ){. 
34140 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
34150 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
34160 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
34170 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
34180 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67          (i64)(pg
34190 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
341a0 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72  pageSize, pPager
341b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61  ->pageSize, &pDa
341c0 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  ta.      );..   
341d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
341e0 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
341f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
34200 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
34210 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20  R_READER ){.    
34220 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
34230 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
34240 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
34250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34260 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
34270 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
34280 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
34290 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
342a0 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20  Data, &pPg);.   
342b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
342c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
342d0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
342e0 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
342f0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
34300 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
34310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
34320 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
34330 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34340 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
34350 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
34360 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  Pg;.          re
34370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34390 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
343a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
343b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
343c0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
343d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
343e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
343f0 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
34400 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20  se;.      pBase 
34410 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34420 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
34430 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  ache, pgno, 3);.
34440 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
34450 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
34460 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34470 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67  FetchStress(pPag
34480 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34490 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20  o, &pBase);.    
344a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
344b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
344c0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
344d0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 61 73          if( pBas
344e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
344f0 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20    pPg = *ppPage 
34500 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
34510 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
34520 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
34530 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34540 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  ire_err;.       
34550 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34560 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
34570 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34580 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34590 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
345a0 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61   pBase);.      a
345b0 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
345c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
345d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
345e0 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
345f0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
34600 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
34610 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
34620 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
34630 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
34640 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
34650 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
34660 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
34670 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
34680 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
34690 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
346a0 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
346b0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
346c0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
346d0 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
346e0 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70  assert( pPg==(*p
346f0 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  pPage) );.  asse
34700 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70  rt( pPg->pgno==p
34710 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
34720 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34730 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ager || pPg->pPa
34740 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
34750 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20   pPg->pPager && 
34760 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
34770 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
34780 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
34790 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
347a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
347b0 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
347c0 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
347d0 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
347e0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
347f0 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
34800 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
34810 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34820 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
34830 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
34840 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
34850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34860 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
34870 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
34880 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
34890 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
348a0 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
348b0 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
348c0 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
348d0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
348e0 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
348f0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34900 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34910 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
34920 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
34930 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
34940 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
34950 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
34960 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
34970 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
34980 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
34990 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
349a0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
349b0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
349c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
349d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
349e0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
349f0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34a00 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
34a10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
34a20 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  ze<pgno || noCon
34a30 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
34a40 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
34a50 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
34a60 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
34a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34a80 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
34a90 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34aa0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34ab0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
34ac0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
34ad0 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
34ae0 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
34af0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
34b00 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
34b10 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
34b20 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
34b30 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
34b40 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
34b50 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
34b60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
34b70 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
34b80 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
34b90 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
34ba0 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
34bb0 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
34bc0 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
34bd0 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
34be0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
34bf0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
34c00 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
34c10 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
34c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
34c30 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
34c40 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
34c50 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
34c60 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
34c70 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
34c80 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
34c90 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
34ca0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
34cb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
34cc0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34cd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34cf0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
34d00 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
34d10 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
34d20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
34d30 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34d40 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34d50 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
34d60 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
34d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
34d80 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
34d90 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
34da0 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
34db0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
34dc0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
34dd0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
34de0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
34df0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
34e00 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20   bMmapOk==0 ){. 
34e10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34e20 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
34e30 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
34e40 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
34e50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34e60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34e70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34e90 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
34ea0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
34eb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
34ec0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
34ed0 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
34ee0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
34ef0 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
34f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34f10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
34f20 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34f30 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
34f40 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
34f50 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
34f60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
34f70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
34f80 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
34f90 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34fa0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
34fb0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
34fc0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
34fd0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
34fe0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
34ff0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
35000 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
35010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
35020 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
35030 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
35040 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
35050 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
35060 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
35070 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
35080 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
35090 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
350a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
350b0 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
350c0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
350d0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
350e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
350f0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
35100 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
35110 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
35120 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
35130 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
35140 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
35150 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
35160 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
35170 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
35180 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
35190 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
351a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
351b0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
351c0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
351d0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
351e0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
351f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
35200 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
35210 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73   Pgno pgno){.  s
35220 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
35230 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
35240 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
35250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
35260 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
35270 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
35280 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
35290 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
352a0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
352b0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  che, pgno, 0);. 
352c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d   assert( pPage==
352d0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73  0 || pPager->has
352e0 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29  HeldSharedLock )
352f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  ;.  if( pPage==0
35300 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
35310 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
35320 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
35330 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35340 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a  pgno, pPage);.}.
35350 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
35360 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
35370 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
35380 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
35390 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
353a0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
353b0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
353c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
353d0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
353e0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
353f0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
35400 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
35410 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
35420 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
35430 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
35440 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
35450 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35460 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
35470 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
35480 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  *pPager;.  asser
35490 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70  t( pPg!=0 );.  p
354a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
354b0 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
354c0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
354d0 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52  AP ){.    pagerR
354e0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50  eleaseMapPage(pP
354f0 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
35500 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
35510 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
35520 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
35530 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
35540 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
35550 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
35560 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
35570 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
35580 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
35590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
355a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
355b0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
355c0 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
355d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
355e0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
355f0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
35600 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
35610 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35620 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
35630 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35640 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
35650 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35660 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
35670 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
35680 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
35690 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
356a0 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
356b0 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
356c0 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
356d0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
356e0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
356f0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
35700 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
35710 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
35720 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
35730 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
35740 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
35750 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
35760 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
35770 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
35780 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
35790 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
357a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
357b0 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
357c0 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
357d0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
357e0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
357f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
35800 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
35810 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
35820 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
35830 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
35840 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
35850 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
35860 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
35870 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
35880 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
35890 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
358a0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
358b0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
358c0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
358d0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
358e0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
358f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
35900 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
35910 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
35920 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
35930 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35940 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
35950 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
35960 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
35970 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
35980 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
35990 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
359a0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
359b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
359c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
359d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
359e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
359f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
35a00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
35a10 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
35a20 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
35a30 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
35a40 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
35a50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35a60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35a70 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
35a80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
35a90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
35aa0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
35ab0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35ac0 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
35ad0 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
35ae0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
35af0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35b00 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
35b10 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
35b20 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
35b30 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
35b40 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
35b50 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
35b60 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
35b70 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
35b80 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
35b90 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
35ba0 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
35bb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
35bc0 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
35bd0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
35be0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
35bf0 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
35c00 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
35c10 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
35c20 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
35c30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
35c40 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35c50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35c60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35c70 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
35c80 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
35c90 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
35ca0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
35cb0 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
35cc0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
35cd0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
35ce0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
35cf0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
35d00 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
35d10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35d20 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
35d30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
35d40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35d50 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
35d60 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
35d70 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
35d80 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
35d90 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
35da0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
35db0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
35dc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
35dd0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
35de0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
35df0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
35e00 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
35e10 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
35e20 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
35e30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53  :.            (S
35e40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
35e50 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
35e60 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f     );..        /
35e70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
35e80 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
35e90 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
35ea0 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
35eb0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
35ec0 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
35ed0 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
35ee0 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
35ef0 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
35f00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
35f20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
35f30 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
35f40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35f50 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
35f60 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
35f70 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
35f80 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
35f90 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
35fa0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
35fb0 67 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29  ger).          )
35fc0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
35fd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35fe0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
35ff0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
36000 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
36010 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
36020 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36030 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
36040 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
36050 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
36060 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
36070 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
36080 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
36090 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
360a0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
360b0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
360c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
360d0 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
360e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
360f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36100 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
36110 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
36120 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
36130 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
36140 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
36150 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36160 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
36170 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
36180 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
36190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
361a0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
361b0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
361c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
361d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
361e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
361f0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
36200 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
36210 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
36220 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36230 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
36240 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36250 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36260 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36270 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
36280 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
36290 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
362a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
362b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
362c0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
362d0 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
362e0 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
362f0 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
36300 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
36310 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
36320 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
36330 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
36340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
36350 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
36360 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
36370 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
36380 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
36390 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
363a0 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
363b0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
363c0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
363d0 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
363e0 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
363f0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
36400 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
36410 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
36420 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
36430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
36440 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
36450 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
36460 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
36470 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
36480 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
36490 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
364a0 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
364b0 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
364c0 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
364d0 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
364e0 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
364f0 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
36500 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
36510 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
36520 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
36530 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
36540 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
36550 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
36560 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
36570 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
36580 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
36590 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
365a0 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
365b0 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
365c0 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
365d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
365e0 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
365f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
36600 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
36610 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
36620 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
36630 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
36640 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
36650 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
36660 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
36670 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36680 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
36690 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
366a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
366b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
366c0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
366d0 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
366e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
366f0 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
36700 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
36710 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
36720 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36730 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
36740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36750 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
36760 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
36770 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
36780 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
36790 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
367a0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
367b0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
367c0 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
367d0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
367e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
367f0 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
36800 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
36810 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
36820 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36830 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
36840 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
36850 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
36860 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
36870 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
36880 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
36890 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
368a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
368b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
368c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
368d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
368e0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
368f0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
36900 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
36910 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
36920 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
36930 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
36940 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
36950 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
36960 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
36970 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
36980 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
36990 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
369a0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
369b0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
369c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
369d0 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
369e0 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
369f0 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
36a00 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
36a10 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
36a20 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
36a30 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
36a40 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
36a50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36a60 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
36a70 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
36a80 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
36a90 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
36aa0 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
36ab0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36ac0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
36ad0 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
36ae0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
36af0 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
36b00 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
36b10 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
36b20 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
36b30 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
36b40 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
36b50 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
36b60 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
36b70 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
36b80 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
36b90 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
36ba0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
36bb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36bc0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
36bd0 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
36be0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
36bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36c00 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
36c10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36c20 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
36c30 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
36c40 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
36c50 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
36c60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36c70 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
36c80 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
36c90 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
36ca0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36cb0 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
36cc0 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
36cd0 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
36ce0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
36cf0 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
36d00 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
36d10 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
36d20 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
36d30 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
36d40 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
36d50 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
36d60 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
36d70 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
36d80 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
36d90 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
36da0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
36db0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
36dc0 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
36dd0 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
36de0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
36df0 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
36e00 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
36e10 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
36e20 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
36e30 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
36e40 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
36e50 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
36e60 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
36e70 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
36e80 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
36e90 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
36ea0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36eb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36ec0 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
36ed0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36ee0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36ef0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
36f00 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
36f10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
36f20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36f30 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
36f40 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36f50 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
36f60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36f70 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
36f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
36f90 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36fa0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
36fb0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
36fc0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
36fd0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
36fe0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
36ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
37000 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74   page pPg onto t
37010 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f  he end of the ro
37020 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
37030 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
37040 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
37050 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
37060 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64  backJournal(PgHd
37070 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
37080 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
37090 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
370a0 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
370b0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
370c0 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
370d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
370e0 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
370f0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
37100 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37110 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
37120 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37130 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
37140 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
37150 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
37160 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
37170 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ot. */.  assert(
37180 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
37190 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
371a0 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
371b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
371c0 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
371d0 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45  nalOff );.  CODE
371e0 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
371f0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
37200 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
37210 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
37220 44 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20  Data2);.  cksum 
37230 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
37240 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
37250 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69  2);..  /* Even i
37260 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
37270 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ull error occurs
37280 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
37290 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  ng the.  ** page
372a0 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
372b0 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
372c0 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
372d0 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f  the page..  ** O
372e0 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
372f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
37300 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
37310 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a  he logic in.  **
37320 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
37330 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
37340 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
37350 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
37360 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64  ed.  ** in the d
37370 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
37380 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
37390 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
373a0 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65  ing so,.  ** the
373b0 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
373c0 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20   follow..  */.  
373d0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
373e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
373f0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37400 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
37410 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  iOff, pPg->pgno)
37420 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
37430 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37440 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
37450 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
37460 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
37470 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
37480 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72  iOff+4);.  if( r
37490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
374a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
374b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
374c0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
374d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
374e0 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  4, cksum);.  if(
374f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37500 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49   return rc;..  I
37510 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
37520 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
37530 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37540 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  o, .           p
37550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37560 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
37570 69 7a 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49  ize));.  PAGER_I
37580 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
37590 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
375a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
375b0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
375c0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
375d0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
375e0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
375f0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37600 20 0a 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e   .       ((pPg->
37610 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
37620 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
37630 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
37640 29 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ));..  pPager->j
37650 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
37660 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
37670 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  e;.  pPager->nRe
37680 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  c++;.  assert( p
37690 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
376a0 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  l!=0 );.  rc = s
376b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
376c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
376d0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
376e0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
376f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
37700 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
37710 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
37720 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37730 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
37740 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
37750 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
37760 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
37770 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
37780 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
37790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
377a0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
377b0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
377c0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
377d0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
377e0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
377f0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
37800 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
37810 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
37820 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
37830 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
37840 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
37850 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
37860 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
37870 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
37880 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
37890 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
378a0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
378b0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
378c0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
378d0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
378e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
378f0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
37900 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
37910 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37920 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
37930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
37940 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
37950 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c  s not called unl
37960 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ess a write-tran
37970 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
37980 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73  ady .  ** been s
37990 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72  tarted. The jour
379a0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20  nal file may or 
379b0 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20  may not be open 
379c0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  at this point.. 
379d0 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20   ** It is never 
379e0 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52  called in the ER
379f0 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a  ROR state..  */.
37a00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37a10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37a20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
37a30 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37a40 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37a50 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
37a60 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37a70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37a80 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
37a90 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
37aa0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37ab0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
37ac0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
37ad0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
37ae0 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
37af0 6c 79 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b  ly==0 );.  CHECK
37b00 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
37b10 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
37b20 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f  le needs to be o
37b30 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65  pened. Higher le
37b40 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76  vel routines hav
37b50 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f  e already.  ** o
37b60 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
37b70 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62  ssary locks to b
37b80 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74  egin the write-t
37b90 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
37ba0 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  the.  ** rollbac
37bb0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
37bc0 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
37bd0 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20   Open it now if 
37be0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
37bf0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
37c00 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
37c10 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
37c20 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
37c30 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20   on the page. . 
37c40 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
37c50 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61  f it were done a
37c60 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fter calling sql
37c70 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37c80 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a  rty(), then.  **
37c90 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20   an error might 
37ca0 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61  occur and the pa
37cb0 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70  ger would end up
37cc0 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   in WRITER_LOCKE
37cd0 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74  D state.  ** wit
37ce0 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61  h pages marked a
37cf0 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63  s dirty in the c
37d00 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
37d10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37d20 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37d30 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  CKED ){.    rc =
37d40 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
37d50 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
37d60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37d70 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37d80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
37d90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
37da0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37db0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
37dc0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37dd0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
37de0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
37df0 67 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74  ge that is about
37e00 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20   to be modified 
37e10 61 73 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73  as dirty. */.  s
37e20 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
37e30 44 69 72 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f  Dirty(pPg);..  /
37e40 2a 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  * If a rollback 
37e50 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6e 20 75 73  journal is in us
37e60 65 2c 20 74 68 65 6d 20 6d 61 6b 65 20 73 75 72  e, them make sur
37e70 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
37e80 69 73 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f  is about.  ** to
37e90 20 63 68 61 6e 67 65 20 69 73 20 69 6e 20 74 68   change is in th
37ea0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
37eb0 61 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 70 61  al, or if the pa
37ec0 67 65 20 69 73 20 61 20 6e 65 77 20 70 61 67 65  ge is a new page
37ed0 20 6f 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65   off.  ** then e
37ee0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  nd of the file, 
37ef0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
37f00 6d 61 72 6b 65 64 20 61 73 20 50 47 48 44 52 5f  marked as PGHDR_
37f10 4e 45 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a  NEED_SYNC..  */.
37f20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
37f30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
37f40 29 20 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  ) == isOpen(pPag
37f50 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66  er->jfd) );.  if
37f60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
37f70 72 6e 61 6c 21 3d 30 0a 20 20 20 26 26 20 73 71  rnal!=0.   && sq
37f80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
37f90 6f 74 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70  otNull(pPager->p
37fa0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
37fb0 70 67 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  pgno)==0.  ){.  
37fc0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
37fd0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
37fe0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   );.    if( pPg-
37ff0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
38000 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
38010 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 64 64     rc = pagerAdd
38020 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f  PageToRollbackJo
38030 75 72 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20 20  urnal(pPg);.    
38040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
38060 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
38070 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
38080 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
38090 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
380a0 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
380b0 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
380c0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
380d0 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
380e0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
380f0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
38100 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
38110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50  .              P
38120 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
38130 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
38140 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
38150 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
38160 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
38170 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
38180 65 20 50 47 48 44 52 5f 44 49 52 54 59 20 62 69  e PGHDR_DIRTY bi
38190 74 20 69 73 20 73 65 74 20 61 62 6f 76 65 20 77  t is set above w
381a0 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 61 73  hen the page was
381b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 69   added to the di
381c0 72 74 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e  rty-list.  ** an
381d0 64 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  d before writing
381e0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
381f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
38200 6e 61 6c 2e 20 20 57 61 69 74 20 75 6e 74 69 6c  nal.  Wait until
38210 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72   now,.  ** after
38220 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
38230 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
38240 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f  journalled, befo
38250 72 65 20 73 65 74 74 69 6e 67 20 74 68 65 0a 20  re setting the. 
38260 20 2a 2a 20 50 47 48 44 52 5f 57 52 49 54 45 41   ** PGHDR_WRITEA
38270 42 4c 45 20 62 69 74 20 74 68 61 74 20 69 6e 64  BLE bit that ind
38280 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
38290 70 61 67 65 20 63 61 6e 20 62 65 20 73 61 66 65  page can be safe
382a0 6c 79 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  ly modified..  *
382b0 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c  /.  pPg->flags |
382c0 3d 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c  = PGHDR_WRITEABL
382d0 45 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68  E;.  .  /* If th
382e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
382f0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
38300 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
38310 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  in it,.  ** then
38320 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20   write the page 
38330 69 6e 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  into the stateme
38340 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
38350 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
38360 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 7b 0a 20  Savepoint>0 ){. 
38370 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
38380 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
38390 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
383a0 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
383b0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
383c0 74 75 72 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70  turn. */.  if( p
383d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
383e0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
383f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
38400 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
38410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
38420 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  *.** This is a v
38430 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65  ariant of sqlite
38440 33 50 61 67 65 72 57 72 69 74 65 28 29 20 74 68  3PagerWrite() th
38450 61 74 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  at runs when the
38460 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20   sector size.** 
38470 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
38480 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 53  he page size.  S
38490 51 4c 69 74 65 20 6d 61 6b 65 73 20 74 68 65 20  QLite makes the 
384a0 28 72 65 61 73 6f 6e 61 62 6c 65 29 20 61 73 73  (reasonable) ass
384b0 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  umption that.** 
384c0 61 6c 6c 20 62 79 74 65 73 20 6f 66 20 61 20 73  all bytes of a s
384d0 65 63 74 6f 72 20 61 72 65 20 77 72 69 74 74 65  ector are writte
384e0 6e 20 74 6f 67 65 74 68 65 72 20 62 79 20 68 61  n together by ha
384f0 72 64 77 61 72 65 2e 20 20 48 65 6e 63 65 2c 20  rdware.  Hence, 
38500 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20  all bytes of.** 
38510 61 20 73 65 63 74 6f 72 20 6e 65 65 64 20 74 6f  a sector need to
38520 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69   be journalled i
38530 6e 20 63 61 73 65 20 6f 66 20 61 20 70 6f 77 65  n case of a powe
38540 72 20 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d 69  r loss in the mi
38550 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69  ddle of.** a wri
38560 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  te..**.** Usuall
38570 79 2c 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  y, the sector si
38580 7a 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ze is less than 
38590 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
385a0 70 61 67 65 20 73 69 7a 65 2c 20 69 6e 20 77 68  page size, in wh
385b0 69 63 68 0a 2a 2a 20 63 61 73 65 20 70 61 67 65  ich.** case page
385c0 73 20 63 61 6e 20 62 65 20 69 6e 64 69 76 69 64  s can be individ
385d0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20 20  ually written.  
385e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
385f0 79 20 72 75 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  y runs in the.**
38600 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73   exceptional cas
38610 65 20 77 68 65 72 65 20 74 68 65 20 70 61 67 65  e where the page
38620 20 73 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72   size is smaller
38630 20 74 68 61 6e 20 74 68 65 20 73 65 63 74 6f 72   than the sector
38640 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
38650 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
38660 20 69 6e 74 20 70 61 67 65 72 57 72 69 74 65 4c   int pagerWriteL
38670 61 72 67 65 53 65 63 74 6f 72 28 50 67 48 64 72  argeSector(PgHdr
38680 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
38690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
386a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
386b0 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   code */.  Pgno 
386c0 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
386d0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
386e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
386f0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
38700 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b  e */.  Pgno pg1;
38710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38720 20 20 20 20 2f 2a 20 46 69 72 73 74