/ Hex Artifact Content
Login

Artifact e2bf43b506447d649e9d9266e988007ae7248699:


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 69  ger->jfd) );.  i
dd60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dd70: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dd80: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dd90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dda0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
ddb0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
ddc0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
ddd0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dde0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
ddf0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
de00: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
de10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
de20: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
de30: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
de40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
de60: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
de70: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
de80: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
de90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dea0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
deb0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
dec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ded0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dee0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
def0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
df00: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
df10: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
df20: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
df30: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
df40: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
df50: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
df60: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
df70: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
df80: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
df90: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
dfa0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
dfb0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
dfc0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
dfd0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dfe0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dff0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
e000: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
e010: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
e020: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
e030: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
e040: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
e050: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
e060: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
e070: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
e080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
e090: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
e0a0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
e0b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
e0c0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
e0d0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
e0e0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e0f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e100: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e120: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e130: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e140: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e150: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e190: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e1a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e1c0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e1d0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e1e0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e1f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e200: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e210: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e220: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e230: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e240: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e250: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e260: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e270: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e280: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e290: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e2a0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e2b0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e2c0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e2d0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e2e0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e2f0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e300: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e310: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e320: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e330: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e340: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e350: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e360: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e370: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e380: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e390: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e3a0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e3b0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e3c0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e3d0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e3e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e3f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e400: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e410: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e430: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e440: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e450: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e460: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e470: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e480: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e490: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e4a0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e4b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e4c0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e4d0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e4e0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e4f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e510: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e520: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e530: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e560: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e570: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e580: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e590: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e5a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e5b0: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e5c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e5d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e5e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e5f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e610: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e620: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e630: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e640: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e650: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e660: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e670: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e680: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e690: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e6a0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e6b0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e6c0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e6d0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e6e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e6f0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e700: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e710: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e720: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e730: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e740: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e750: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e760: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e770: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e780: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e790: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e7a0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e7b0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e7c0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e7d0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e7e0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e7f0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e800: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e810: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e820: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e830: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e840: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e850: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e860: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e870: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e880: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e890: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e8a0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e8b0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e8c0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e8d0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e8e0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e8f0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e900: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e910: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e920: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e930: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e940: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e960: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e970: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e980: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e990: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e9a0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e9b0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e9c0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e9d0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e9e0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e9f0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
ea00: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
ea10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
ea20: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
ea30: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
ea40: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
ea50: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
ea60: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
ea70: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
ea80: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
ea90: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
eaa0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
eab0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
eac0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
ead0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
eae0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
eaf0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
eb00: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
eb10: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
eb20: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
eb30: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
eb40: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
eb50: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
eb60: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
eb70: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
eb80: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
eb90: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
eba0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ebb0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ebc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ebd0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ebe0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ebf0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ec00: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ec10: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ec20: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ec30: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ec40: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
ec50: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
ec60: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
ec70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ec80: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec90: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eca0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ecb0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ecc0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
ecd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
ece0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
ecf0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ed00: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
ed10: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
ed20: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
ed30: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
ed40: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
ed50: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ed60: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ed70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ed80: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ed90: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eda0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
edb0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
edc0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
edd0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ede0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
edf0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ee00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ee10: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ee20: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ee30: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ee40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
ee50: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ee60: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ee70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ee80: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ee90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
eea0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
eeb0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
eec0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
eed0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eee0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
eef0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ef00: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ef10: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ef20: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ef30: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ef40: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ef50: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ef60: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ef70: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ef80: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ef90: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
efa0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
efb0: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
efc0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
efd0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
efe0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eff0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
f000: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f010: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f020: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
f030: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
f040: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f050: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
f060: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
f070: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
f080: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
f090: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
f0a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
f0b0: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
f0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
f0d0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
f0e0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
f0f0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f100: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f110: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f120: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f130: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f140: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f150: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f160: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f170: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f180: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f190: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f1a0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f1b0: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f1c0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f1d0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f1e0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f1f0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f200: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f210: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f220: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f230: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f240: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f250: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f260: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f270: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f280: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f290: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f2a0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f2b0: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f2c0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f2d0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f2e0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f2f0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f300: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f310: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f320: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f330: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f340: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f350: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f360: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f370: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f380: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f390: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f3a0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f3b0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f3c0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f3d0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f3e0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f3f0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f400: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f410: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f430: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f440: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f450: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f460: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f470: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f480: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f490: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f4a0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f4b0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f4c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f4d0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f4e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f4f0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f500: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f510: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f520: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f530: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f540: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f550: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f560: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f570: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f580: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f590: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f5a0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f5b0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f5c0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f5d0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f5e0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f5f0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f600: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f610: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f620: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f630: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f640: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f650: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f660: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f670: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f680: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f690: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f6a0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f6b0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f6c0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f6d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f6e0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f6f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f700: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f710: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f720: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f730: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f740: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f750: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f760: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f770: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f780: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f790: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f7a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f7b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f7c0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f7d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f7e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f7f0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f800: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f810: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f820: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f830: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f840: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f850: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f860: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f870: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f880: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f890: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f8a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f8b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f8c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f8d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f8f0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f900: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f910: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f930: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f940: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f950: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f960: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f970: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f980: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f990: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f9a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f9c0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f9d0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f9e0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f9f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
fa20: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
fa30: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
fa40: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
fa50: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
fa60: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
fa70: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
fa80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
fa90: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
faa0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
fab0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
fac0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
fad0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
fae0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
faf0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
fb00: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
fb10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
fb20: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
fb30: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
fb40: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
fb50: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
fb60: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
fb70: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
fb80: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
fb90: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
fba0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fbb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fbc0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fbd0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fbe0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fbf0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fc00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fc10: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fc20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fc40: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
fc50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fc60: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fc70: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fc80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fc90: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
fca0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fcb0: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fcc0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fcd0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fce0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fcf0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fd00: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fd10: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fd20: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fd30: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fd40: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fd50: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fd60: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fd70: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fd80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fd90: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fda0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fdb0: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fdc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fdd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fde0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fdf0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fe00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fe10: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fe20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fe30: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fe40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fe50: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fe60: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fe70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fe80: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fe90: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fea0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
feb0: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fec0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fed0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fee0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fef0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
ff00: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
ff10: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
ff20: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
ff30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ff40: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
ff50: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
ff60: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
ff70: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ff80: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ff90: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
ffa0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
ffb0: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
ffc0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ffd0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ffe0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fff0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
10000 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10010 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
10020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
10030 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
10040 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
10050 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
10060 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
10070 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
10080 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100a0 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
100b0 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
100c0 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
100d0 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
100e0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
100f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10100 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
10110 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10120 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10130 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10140 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
10150 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
10160 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10170 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10180 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10190 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
101a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
101b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
101c0 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
101d0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
101e0 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
101f0 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10200 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10210 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10220 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10230 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10240 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
10250 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
10260 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10270 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10280 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10290 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
102a0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
102b0 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
102c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
102d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
102e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
102f0 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10300 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10310 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10320 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10330 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10340 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
10350 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
10360 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10370 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10380 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10390 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
103a0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
103b0 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
103c0 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
103d0 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
103e0 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
103f0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10400 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10410 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10420 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10430 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10440 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10450 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10460 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10470 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10480 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10490 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
104a0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
104b0 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
104c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
104d0 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
104e0 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
104f0 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10500 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10510 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10520 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10530 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10540 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10550 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10560 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10570 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10580 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10590 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
105a0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
105b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
105c0 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
105d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
105e0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
105f0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10600 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10610 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10620 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10630 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10640 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10650 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10660 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10670 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10680 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10690 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
106a0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
106b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
106c0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
106d0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
106e0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
106f0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10700 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10710 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10720 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10730 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10740 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10750 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10760 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10770 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10780 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10790 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
107a0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
107b0 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
107c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
107d0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
107e0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
107f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10800 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10810 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10820 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10830 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10840 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10850 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10860 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10870 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10880 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10890 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
108a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
108b0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
108c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
108d0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
108e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
108f0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10900 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10910 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10920 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10930 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10940 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10950 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10960 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10970 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10980 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10990 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
109a0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
109b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
109c0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
109d0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
109e0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
109f0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10a00 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10a10 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10a20 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10a30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10a40 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10a50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10a60 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10a70 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10a80 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10a90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10aa0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10ab0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10ac0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10ad0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10ae0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10af0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10b00 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10b10 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10b20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10b30 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10b40 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10b50 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10b70 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10b80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10b90 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10ba0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10bb0 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10bc0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10bd0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10be0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10bf0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10c00 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10c20 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10c30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10c50 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10c80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10c90 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10cb0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10cc0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10cd0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10d00 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10d10 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10d20 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10d40 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10d50 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10d60 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10d90 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10da0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10db0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10dd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10de0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10df0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10e10 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10e20 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10e30 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10e40 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10e70 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10e90 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10ea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10eb0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10ec0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10ed0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10ee0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10ef0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10f00 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10f10 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10f20 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10f30 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10f40 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10f50 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10f60 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10f70 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10f80 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10f90 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10fa0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10fb0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10fc0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10fd0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10fe0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10ff0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11000 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
11010 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
11020 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
11030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11040 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
11050 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
11060 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
11070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11080 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
11090 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
110a0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
110b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
110c0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
110d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
110e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
110f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
11110 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11120 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11130 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
11140 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
11150 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11160 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11170 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11180 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11190 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
111a0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
111b0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
111c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
111d0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
111e0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
111f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11200 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11210 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11220 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11230 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11240 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11250 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
11260 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11270 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
112a0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
112b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
112c0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
112d0 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
112e0 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
112f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11300 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11310 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11320 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11330 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11340 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
11350 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
11360 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11370 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11380 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11390 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
113a0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
113b0 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
113c0 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
113d0 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
113e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
113f0 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11400 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11410 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11420 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11430 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11440 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11450 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11460 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11470 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11480 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11490 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
114a0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
114b0 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
114c0 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
114d0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
114e0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
114f0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11500 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11510 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11520 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11530 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11540 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11550 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11560 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11570 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11590 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
115a0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
115b0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
115c0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
115d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
115e0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
115f0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11600 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11610 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11620 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11630 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11640 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11650 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11660 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11670 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11680 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11690 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
116a0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
116b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
116c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
116d0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
116e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
116f0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11700 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11710 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11720 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11730 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11740 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11750 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11760 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11770 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11780 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11790 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
117a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
117b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
117c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
117d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
117e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
117f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11800 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11820 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11830 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11840 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11850 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11860 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11870 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11880 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11890 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
118a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
118b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
118c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
118d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
118e0 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
118f0 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11900 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11910 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11920 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11930 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11940 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11950 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11960 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11970 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
11980 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
11990 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
119a0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
119b0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
119c0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
119d0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
119e0 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
119f0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11a00 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11a10 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11a20 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11a30 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11a40 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
11a60 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
11a70 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
11a80 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
11a90 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
11aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11ab0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11ac0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11ad0 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11ae0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11af0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11b00 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11b10 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11b20 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11b30 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11b40 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
11b50 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
11b60 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
11b70 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
11b80 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
11b90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
11ba0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11bb0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11bc0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11bd0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11be0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11bf0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11c00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11c10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11c20 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11c30 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11c40 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11c50 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11c60 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11c70 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11c80 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
11c90 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11ca0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11cb0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11cc0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11cd0 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11ce0 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11cf0 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11d00 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11d10 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11d20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11d30 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11d40 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11d50 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11d60 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11d70 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11d80 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
11d90 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11da0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11db0 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11dd0 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11de0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11df0 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11e00 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11e10 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11e20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11e30 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11e40 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11e50 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11e60 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11e70 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11e80 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
11e90 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11ea0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11eb0 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11ec0 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11ed0 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11ee0 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11ef0 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11f00 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11f10 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11f20 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11f30 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11f40 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11f50 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11f60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11f70 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11f80 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11f90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11fa0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11fb0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11fc0 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11fd0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11fe0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11ff0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
12000 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
12010 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
12020 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
12030 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
12040 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
12050 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12060 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
12070 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
12080 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
12090 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
120a0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
120b0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
120c0 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
120d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
120e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
120f0 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
12120 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
12130 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
12140 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
12150 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
12160 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
12170 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
12180 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
12190 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
121a0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
121b0 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
121c0 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
121d0 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
121e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
121f0 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
12200 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
12210 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
12220 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
12230 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
12240 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
12250 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
12260 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
12270 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
12280 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12290 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
122a0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
122b0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
122c0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
122d0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
122e0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
122f0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12300 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
12310 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12320 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12330 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
12340 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
12350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12360 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12370 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
12380 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12390 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
123a0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
123b0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
123c0 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
123d0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
123e0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
123f0 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
12400 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
12410 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
12420 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12430 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
12440 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
12450 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
12460 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12470 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
12480 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
12490 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
124a0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
124b0 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
124c0 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
124d0 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
124e0 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
124f0 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12500 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12510 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12520 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12530 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
12550 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
12560 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
12570 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
12580 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
12590 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
125a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
125b0 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
125c0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
125d0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
125e0 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
125f0 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12600 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12610 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12620 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12630 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12640 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
12650 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
12660 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
12670 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
12680 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
12690 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
126a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
126b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
126c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
126d0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
126e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
126f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12700 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12710 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12720 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12730 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12740 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
12750 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12760 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
12770 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
12780 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
12790 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
127a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
127b0 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
127c0 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
127d0 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
127e0 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
127f0 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12800 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12810 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12820 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12830 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
12840 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ode ){.    asser
12850 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
12860 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12870 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
12880 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12890 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
128a0 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72  File;.    pPager
128b0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
128c0 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65  _OPEN;.    pPage
128d0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
128e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20  ITE_OK;.    if( 
128f0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
12900 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
12910 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
12920 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50  0, 0);.  }..  pP
12930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12940 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12950 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
12960 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
12970 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter = 0;.}../*.*
12980 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12990 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
129a0 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46  er an IOERR or F
129b0 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72  ULL error that r
129c0 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70  equires.** the p
129d0 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69  ager to transiti
129e0 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  on into the ERRO
129f0 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76 65  R state may ahve
12a00 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68   occurred..** Th
12a10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
12a20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
12a30 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
12a40 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
12a50 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63   .** the error-c
12a60 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
12a70 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
12a80 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
12a90 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20  . The .** value 
12aa0 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
12ab0 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
12ac0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
12ad0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
12ae0 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
12af0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
12b00 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
12b10 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
12b20 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75   the.** IOERR su
12b30 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67  b-codes, the pag
12b40 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52  er enters the ER
12b50 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68  ROR state and th
12b60 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
12b70 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  is stored in Pag
12b80 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c  er.errCode. Whil
12b90 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61  e the pager rema
12ba0 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ins in the ERROR
12bb0 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d   state,.** all m
12bc0 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f  ajor API calls o
12bd0 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c  n the Pager will
12be0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
12bf0 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64  urn Pager.errCod
12c00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52  e..**.** The ERR
12c10 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61 74  OR state indicat
12c20 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
12c30 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12c40 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
12c50 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
12c60 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
12c70 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
12c80 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
12c90 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
12ca0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12cb0 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
12cc0 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
12cd0 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
12ce0 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
12cf0 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
12d00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12d10 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
12d20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
12d30 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
12d40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
12d50 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
12d60 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
12d70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
12d80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12d90 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
12da0 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
12db0 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
12dc0 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
12dd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
12de0 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
12df0 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
12e00 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12e10 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
12e20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12e30 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
12e40 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
12e50 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
12e60 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
12e70 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d    );.  if( rc2==
12e80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72  SQLITE_FULL || r
12e90 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
12ea0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12eb0 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
12ec0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12ed0 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a   = PAGER_ERROR;.
12ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12ef0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
12f00 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
12f10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
12f20 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a  o nPage);../*.**
12f30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
12f40 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
12f50 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
12f60 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
12f70 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12f80 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12f90 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12fa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12fb0 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12fc0 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12fd0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12fe0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12ff0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
13000 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
13010 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
13020 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
13030 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
13040 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
13050 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
13060 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
13070 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
13080 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
13090 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
130a0 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
130b0 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
130c0 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
130d0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
130e0 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
130f0 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
13100 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
13110 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13120 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
13130 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
13140 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
13150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
13160 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13170 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
13180 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
13190 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
131a0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
131b0 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
131c0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
131d0 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
131e0 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
131f0 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
13200 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
13210 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
13220 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
13230 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
13240 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
13250 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
13260 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
13270 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
13280 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13290 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
132a0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
132b0 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
132c0 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
132d0 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
132e0 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
132f0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
13300 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13310 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
13320 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
13330 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
13340 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
13350 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
13360 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
13370 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
13380 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
13390 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
133a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
133b0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
133c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
133d0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
133e0 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
133f0 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
13400 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
13410 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
13420 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
13430 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
13440 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
13450 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
13460 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
13470 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
13480 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
13490 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
134a0 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
134b0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
134c0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
134d0 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
134e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
134f0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
13500 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
13510 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
13520 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
13530 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13540 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13550 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
13560 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
13570 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
13580 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
13590 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
135a0 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
135b0 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
135c0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
135d0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
135e0 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
135f0 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
13600 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
13610 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
13620 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
13630 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
13640 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
13650 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
13660 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
13670 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
13680 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
13690 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
136a0 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
136b0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
136c0 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
136d0 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
136e0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
136f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
13700 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
13710 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
13720 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
13730 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
13740 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
13750 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13760 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
13770 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13780 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13790 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
137a0 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
137b0 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
137c0 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
137d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
137e0 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
137f0 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13800 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13820 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
13830 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
13840 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
13850 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
13860 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
13870 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13880 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13890 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
138a0 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
138b0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
138c0 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
138d0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
138e0 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
138f0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13900 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13910 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f  sMaster, int bCo
13920 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  mmit){.  int rc 
13930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13940 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
13950 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
13960 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
13970 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
13980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13990 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
139a0 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
139b0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
139c0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ..  /* Do nothin
139d0 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64  g if the pager d
139e0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
139f0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
13a00 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61  action.  ** or a
13a10 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
13a20 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75  ED lock. This fu
13a30 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
13a40 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a  lled when there.
13a50 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65    ** is no write
13a60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
13a70 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56  ive but a RESERV
13a80 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
13a90 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20  ck is.  ** held 
13aa0 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d  under two circum
13ab0 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20  stances:.  **.  
13ac0 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20  **   1. After a 
13ad0 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a  successful hot-j
13ae0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
13af0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69   it is called wi
13b00 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74  th.  **      eSt
13b10 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
13b20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
13b30 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a  SIVE_LOCK..  **.
13b40 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63    **   2. If a c
13b50 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c  onnection with l
13b60 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
13b70 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e  usive holding an
13b80 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a   EXCLUSIVE .  **
13b90 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63        lock switc
13ba0 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b  hes back to lock
13bb0 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
13bc0 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65  and then execute
13bd0 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65  s a.  **      re
13be0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad-transaction, 
13bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13c00 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74   called with eSt
13c10 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
13c20 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64  R .  **      and
13c30 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13c40 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  E_LOCK when the 
13c50 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13c60 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f   is closed..  */
13c70 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
13c80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
13c90 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
13ca0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
13cb0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
13cc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13cd0 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
13ce0 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50  TER_LOCKED && pP
13cf0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45  ager->eLock<RESE
13d00 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
13d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13d20 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73  K;.  }..  releas
13d30 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
13d40 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
13d50 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13d60 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
13d70 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
13d80 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
13d90 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13da0 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
13db0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
13dc0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c  );..    /* Final
13dd0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13de0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
13df0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
13e00 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
13e10 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
13e20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65  /* assert( pPage
13e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13e40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13e50 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20  E_MEMORY ); */. 
13e60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13e70 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13e80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13e90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ea0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13eb0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13ec0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13ed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13ef0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13f20 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13f30 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13f40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13f50 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
13f60 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
13f70 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
13f80 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  re the new file 
13f90 73 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20  size is written 
13fa0 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72  into the inode r
13fb0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20  ight away..     
13fc0 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
13fd0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  e the journal mi
13fe0 67 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f  ght resurrect fo
13ff0 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20  llowing a power 
14000 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20  loss and.       
14010 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20     ** cause the 
14020 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  last transaction
14030 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
14040 53 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  See.          **
14050 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
14060 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68  a.mozilla.org/sh
14070 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30  ow_bug.cgi?id=10
14080 37 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20  72773.          
14090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
140a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
140b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
140c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
140d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
140e0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
140f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14100 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14120 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14130 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
14140 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
14150 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
14160 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14170 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
14180 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
14190 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
141a0 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
141b0 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
141c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
141d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
141e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
141f0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14200 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
14210 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
14220 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
14230 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
14240 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
14250 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
14260 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
14270 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
14280 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
14290 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
142a0 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
142b0 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
142c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
142d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
142e0 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
142f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
14300 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
14310 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14320 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74  te = (!pPager->t
14330 65 6d 70 46 69 6c 65 26 26 21 73 71 6c 69 74 65  empFile&&!sqlite
14340 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14350 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ry(pPager->jfd))
14360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14380 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14390 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
143a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
143b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
143c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
143d0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
143e0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
143f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14400 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14410 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
14420 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14430 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14440 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
14450 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
14460 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14470 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
14480 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
14490 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
144a0 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
144b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
144c0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
144d0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
144e0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
144f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14500 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
14510 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
14520 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
14530 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
14540 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
14550 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
14560 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
14570 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
14580 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14590 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
145a0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
145b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
145c0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
145d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
145e0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
145f0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
14600 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
14610 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
14620 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
14630 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
14640 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
14650 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
14660 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
14670 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
14680 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14690 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
146a0 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
146b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
146c0 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
146d0 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
146e0 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
146f0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
14700 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
14710 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
14720 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
14730 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
14740 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
14750 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
14760 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
14770 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
14780 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14790 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
147a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
147b0 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
147c0 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
147d0 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
147e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
147f0 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
14800 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
14810 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
14820 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
14830 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
14840 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
14850 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
14860 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
14870 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
14880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14890 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
148a0 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
148b0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
148c0 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
148d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
148e0 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
148f0 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
14900 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
14910 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
14920 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
14930 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
14940 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
14950 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
14960 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
14970 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
14980 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
14990 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
149a0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
149b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
149c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
149d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
149e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
149f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
14a00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14a10 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
14a20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
14a30 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50  mit && isOpen(pP
14a40 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
14a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
14a60 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
14a70 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
14a80 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45  NTL_COMMIT_PHASE
14a90 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  TWO, 0);.    if(
14aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
14ab0 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
14ac0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
14ad0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
14ae0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
14af0 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  (!pagerUseWal(pP
14b00 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33  ager) || sqlite3
14b10 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
14b20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
14b30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20  )).  ){.    rc2 
14b40 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
14b50 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
14b60 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
14b70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
14b80 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  e = 0;.  }.  pPa
14b90 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
14ba0 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50  GER_READER;.  pP
14bb0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
14bc0 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
14bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
14be0 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
14bf0 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
14c00 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
14c10 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
14c20 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
14c30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14c40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14c50 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
14c60 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14c70 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  R state, do not 
14c80 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
14c90 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
14ca0 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
14cb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
14cc0 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
14cd0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
14ce0 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
14cf0 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
14d00 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
14d10 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14d20 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74   file and move t
14d30 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
14d40 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20   OPEN state. If 
14d50 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74  this .** means t
14d60 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68  hat there is a h
14d70 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
14d80 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
14d90 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a  em, the next .**
14da0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f   connection to o
14db0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
14dc0 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
14dd0 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
14de0 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c  his one) .** wil
14df0 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  l roll it back..
14e00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14e10 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
14e20 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14e30 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
14e40 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
14e50 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
14e60 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
14e70 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
14e80 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
14e90 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
14ea0 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
14eb0 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
14ec0 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
14ed0 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
14ee0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
14ef0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
14f00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
14f10 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
14f20 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
14f30 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
14f40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14f50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50  AGER_ERROR && pP
14f60 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14f70 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
14f80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14f90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14fa0 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  r) );.    if( pP
14fb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
14fc0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
14fd0 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
14fe0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
14ff0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  loc();.      sql
15000 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
15010 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
15020 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
15030 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  nMalloc();.    }
15040 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
15050 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15060 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15070 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
15080 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
15090 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64  .      pager_end
150a0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
150b0 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
150c0 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  }.  }.  pager_un
150d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
150e0 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
150f0 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e   aData must poin
15100 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
15110 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15120 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
15130 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  ta. Compute and 
15140 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
15150 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20  m based ont the 
15160 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
15170 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61  .** page of data
15180 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
15190 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72   value of pPager
151a0 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a  ->cksumInit..**.
151b0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
151c0 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
151d0 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
151e0 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
151f0 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
15200 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65  ial value (pPage
15210 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e  r->cksumInit) an
15220 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79  d every 200th by
15230 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  te.** of the pag
15240 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67  e data, starting
15250 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65   with byte offse
15260 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t (pPager->pageS
15270 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63  ize%200)..** Eac
15280 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
15290 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69  reted as an 8-bi
152a0 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
152b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69  er..**.** Changi
152c0 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75  ng the formula u
152d0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
152e0 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73  his checksum res
152f0 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ults in an.** in
15300 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e  compatible journ
15310 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  al file format..
15320 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c  **.** If journal
15330 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
15340 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
15350 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
15360 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73  ost likely .** s
15370 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20  cenario is that 
15380 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
15390 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
153a0 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
153b0 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75  ed. .** It is mu
153c0 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
153d0 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
153e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
153f0 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
15400 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
15410 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
15420 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
15430 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
15440 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
15450 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
15460 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
15470 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
15480 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
15490 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
154a0 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
154b0 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
154c0 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
154d0 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
154e0 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
154f0 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c   /* Checksum val
15500 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
15510 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
15520 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20  ->pageSize-200; 
15530 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15540 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68   counter */.  wh
15550 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
15560 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
15570 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
15580 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
15590 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
155a0 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
155b0 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e   page size and n
155c0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
155d0 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20  d bytes back.** 
155e0 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f  to the codec..*/
155f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
15600 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20  AS_CODEC.static 
15610 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74  void pagerReport
15620 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
15630 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
15640 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
15650 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  g ){.    pPager-
15660 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28  >xCodecSizeChng(
15670 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20  pPager->pCodec, 
15680 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
156b0 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  t)pPager->nReser
156c0 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ve);.  }.}.#else
156d0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
156e0 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20  eportSize(X)    
156f0 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20   /* No-op if we 
15700 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
15710 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66   codec */.#endif
15720 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15730 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
15740 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75  Make sure the nu
15750 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15760 20 62 69 74 73 20 69 73 20 74 68 65 20 73 61 6d   bits is the sam
15770 65 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61  e in the destina
15780 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73  tion.** pager as
15790 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f   it is in the so
157a0 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65  urce.  This come
157b0 73 20 75 70 20 77 68 65 6e 20 61 20 56 41 43 55  s up when a VACU
157c0 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a  UM changes the.*
157d0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  * number of rese
157e0 72 76 65 64 20 62 69 74 73 20 74 6f 20 74 68 65  rved bits to the
157f0 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e   "optimal" amoun
15800 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
15810 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65  e3PagerAlignRese
15820 72 76 65 28 50 61 67 65 72 20 2a 70 44 65 73 74  rve(Pager *pDest
15830 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a  , Pager *pSrc){.
15840 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65    if( pDest->nRe
15850 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65  serve!=pSrc->nRe
15860 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65  serve ){.    pDe
15870 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70  st->nReserve = p
15880 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  Src->nReserve;. 
15890 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
158a0 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d  ze(pDest);.  }.}
158b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
158c0 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
158d0 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  e from either th
158e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
158f0 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31  if isMainJrnl==1
15900 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ) or.** from the
15910 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66   sub-journal (if
15920 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20   isMainJrnl==0) 
15930 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61  and playback tha
15940 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70  t page..** The p
15950 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66  age begins at of
15960 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e  fset *pOffset in
15970 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65  to the file. The
15980 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c   *pOffset.** val
15990 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
159a0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
159b0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
159c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
159d0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  .** The main rol
159e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
159f0 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  es checksums - t
15a00 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
15a10 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f  rnal does .** no
15a20 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
15a30 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15a40 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72  he page record r
15a50 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15a60 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
15a70 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
15a80 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
15a90 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
15aa0 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62  Size, then playb
15ab0 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65  ack is.** skippe
15ac0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
15ad0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
15ae0 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e  ** If pDone is n
15af0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
15b00 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20   is a record of 
15b10 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
15b20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
15b30 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66  played back.  If
15b40 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f   the page at *pO
15b50 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64  ffset has alread
15b60 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
15b70 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f  ck.** (if the co
15b80 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e  rresponding pDon
15b90 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68  e bit is set) th
15ba0 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79  en skip the play
15bb0 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75  back..** Make su
15bc0 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74  re the pDone bit
15bd0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
15be0 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70  o the *pOffset p
15bf0 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72  age is set.** pr
15c00 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ior to returning
15c10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
15c20 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75  age record is su
15c30 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
15c40 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15c50 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61  ournal file.** a
15c60 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20  nd played back, 
15c70 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
15c80 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
15c90 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
15ca0 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69  s.** while readi
15cb0 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72  ng the record fr
15cc0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15cd0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69  rnal file or whi
15ce0 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f  le writing.** to
15cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15d00 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  le, then the IO 
15d10 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
15d20 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a  turned. If data.
15d30 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
15d40 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
15d50 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15d60 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20  ile but appears 
15d70 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74  to be.** corrupt
15d80 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
15d90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74  is returned. Dat
15da0 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  a is considered 
15db0 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20  corrupted in.** 
15dc0 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
15dd0 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66  s:.** .**   * If
15de0 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65   the record page
15df0 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67  -number is illeg
15e00 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d  al (0 or PAGER_M
15e10 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20  J_PGNO), or.**  
15e20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15e30 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
15e40 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
15e50 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
15e60 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20  .**     and the 
15e70 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64  checksum field d
15e80 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
15e90 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74  e record content
15ea0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20  ..**.** Neither 
15eb0 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65  of these two sce
15ec0 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69  narios are possi
15ed0 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76  ble during a sav
15ee0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
15ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
15f00 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  s a savepoint ro
15f10 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d  llback, then mem
15f20 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20  ory may have to 
15f30 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  be dynamically.*
15f40 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
15f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  his function. If
15f60 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
15f70 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74  e and an allocat
15f80 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51  ion fails,.** SQ
15f90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
15fa0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
15fb0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
15fc0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
15fd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ff0 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e  * The pager bein
16000 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  g played back */
16010 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
16040 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
16050 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
16060 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  one,            
16070 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66      /* Bitvec of
16080 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70   pages already p
16090 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
160a0 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160c0 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
160d0 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
160e0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
160f0 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20  sSavepnt        
16100 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16110 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
16120 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   rollback */.){.
16130 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
16140 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
16150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16160 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
16170 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
16180 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161a0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
161b0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
161c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
161d0 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
161e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
161f0 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
16200 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
16210 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  .  char *aData; 
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
16240 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
16250 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
16260 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
16270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
16280 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
16290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
162a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e  e */.  int isSyn
162b0 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ced;            
162c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
162d0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20  journal page is 
162e0 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73  synced */..  ass
162f0 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
16300 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16310 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
16320 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16330 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
16340 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
16350 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
16360 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
16370 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
16380 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
16390 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
163a0 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
163b0 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
163c0 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
163d0 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
163e0 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
163f0 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
16400 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
16410 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
16420 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
16430 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
16440 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
16450 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
16460 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
16470 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
16480 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
16490 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
164a0 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
164b0 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
164c0 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
164d0 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
164e0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
164f0 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
16500 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
16510 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
16520 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
16530 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
16540 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
16550 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16560 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
16570 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16580 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
16590 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
165a0 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
165b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
165c0 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
165d0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
165e0 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
165f0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
16600 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
16610 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
16620 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
16630 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16640 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
16650 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
16660 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
16670 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
16680 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
16690 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
166a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
166b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
166c0 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
166d0 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
166e0 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
166f0 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
16700 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
16710 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
16720 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
16730 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
16740 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
16750 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16760 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
16770 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
16780 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
16790 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
167a0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
167b0 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
167c0 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
167d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
167e0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
167f0 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
16800 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16810 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
16820 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
16830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16840 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16850 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
16860 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
16870 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
16880 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
16890 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
168a0 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
168b0 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
168c0 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
168d0 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
168e0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
168f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
16900 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
16910 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
16920 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
16930 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
16940 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
16950 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
16960 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
16970 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
16980 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
16990 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
169a0 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
169b0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
169c0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
169d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
169e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
169f0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16a10 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
16a20 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
16a30 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
16a40 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
16a50 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
16a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16a70 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
16a80 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
16a90 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
16aa0 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
16ab0 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
16ac0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16ad0 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
16ae0 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
16af0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
16b00 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
16b10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16b20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
16b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16b40 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
16b50 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16b60 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75  d back before du
16b70 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
16b80 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
16b90 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
16ba0 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
16bb0 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
16bc0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
16bd0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
16be0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
16bf0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
16c00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16c10 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
16c20 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
16c30 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
16c40 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
16c50 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16c60 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
16c70 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
16c80 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
16c90 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
16ca0 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
16cb0 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
16cc0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
16cd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16ce0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
16cf0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
16d00 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
16d10 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
16d20 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
16d30 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16d40 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
16d50 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
16d60 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
16d70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16d80 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
16d90 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
16da0 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
16db0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
16dc0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
16dd0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
16de0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
16df0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
16e00 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
16e10 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
16e20 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16e30 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
16e40 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
16e50 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16e60 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
16e70 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
16e80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
16e90 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
16ea0 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
16eb0 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
16ec0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
16ed0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
16ee0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
16ef0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
16f00 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
16f10 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
16f20 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
16f30 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
16f40 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
16f50 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
16f60 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
16f70 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
16f80 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
16f90 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
16fa0 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
16fb0 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
16fc0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
16fd0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
16fe0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
16ff0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
17000 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
17010 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17020 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
17030 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
17040 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
17050 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
17060 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
17070 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
17080 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
17090 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
170a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
170b0 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
170c0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
170d0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
170e0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
170f0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
17100 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17110 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
17120 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
17130 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
17140 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
17150 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
17160 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
17170 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
17180 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
17190 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
171a0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
171b0 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
171c0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
171d0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
171e0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
171f0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
17200 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
17210 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
17220 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
17230 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
17240 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
17250 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
17260 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
17270 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
17280 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
17290 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
172a0 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
172b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
172c0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
172d0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
172e0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
172f0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
17300 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
17310 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
17320 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
17330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17340 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
17350 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
17360 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
17370 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
17380 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
17390 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
173a0 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
173b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
173c0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
173d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
173e0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
173f0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
17400 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
17410 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
17420 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
17430 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
17440 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
17450 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
17460 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
17470 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
17480 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
17490 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
174a0 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
174b0 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
174c0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
174d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
174e0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
174f0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
17500 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17510 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
17520 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
17530 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
17540 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
17550 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
17560 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
17570 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
17580 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
17590 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
175a0 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45  pPg==0 );.  PAGE
175b0 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
175c0 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
175d0 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
175e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
175f0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
17600 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
17610 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17620 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
17630 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
17640 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
17650 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
17660 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
17670 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
17680 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
17690 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
176a0 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
176b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
176c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
176d0 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
176e0 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
176f0 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
17700 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
17710 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17720 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67  >fd).   && (pPag
17730 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
17740 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
17750 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
17760 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
17770 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
17780 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
17790 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
177a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
177b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
177c0 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
177d0 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
177e0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
177f0 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  NC)!=0 );.    as
17800 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17810 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17830 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
17840 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70  , (u8 *)aData, p
17850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
17860 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
17870 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
17880 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
17890 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
178a0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
178b0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
178c0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
178d0 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
178e0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
178f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
17900 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 73  M_BKPT);.      s
17910 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
17920 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
17930 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
17940 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
17950 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
17960 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
17970 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
17980 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , aData);.    }.
17990 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
179a0 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
179b0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
179c0 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
179d0 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
179e0 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
179f0 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
17a00 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
17a10 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
17a20 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
17a30 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
17a40 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
17a50 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
17a60 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
17a70 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
17a80 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
17a90 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
17aa0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17ab0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
17ac0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
17ad0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
17ae0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
17af0 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
17b00 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
17b10 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
17b20 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
17b30 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
17b40 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
17b50 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
17b60 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
17b70 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
17b80 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
17b90 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
17ba0 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
17bb0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17bc0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
17bd0 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
17be0 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
17bf0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
17c00 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
17c10 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
17c20 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
17c30 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
17c40 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
17c50 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
17c60 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
17c70 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
17c80 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
17c90 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
17ca0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
17cb0 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
17cc0 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
17cd0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17ce0 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
17cf0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
17d00 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
17d10 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
17d20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
17d30 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
17d40 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
17d50 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
17d60 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
17d70 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17d80 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
17d90 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17da0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
17db0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
17dc0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
17dd0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
17de0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
17df0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
17e00 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
17e10 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17e20 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
17e30 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
17e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17e50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17e60 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17e70 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17e80 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17e90 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17ea0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17eb0 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17ec0 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17ed0 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
17ee0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
17ef0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
17f00 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
17f10 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
17f20 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
17f30 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17f40 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17f50 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17f60 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17f70 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17f80 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17f90 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17fa0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17fb0 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17fc0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17fd0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
17fe0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
17ff0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
18000 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
18010 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
18020 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
18030 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
18040 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18050 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
18060 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
18070 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
18080 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
18090 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
180a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
180b0 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
180c0 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
180d0 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
180e0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
180f0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
18100 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
18110 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
18120 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
18130 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
18140 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
18150 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
18160 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
18170 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
18180 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
18190 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
181a0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
181b0 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
181c0 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
181d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
181e0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
181f0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
18200 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
18210 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
18220 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
18230 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
18240 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
18250 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
18260 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
18270 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
18280 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
18290 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
182a0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
182b0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
182c0 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
182d0 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
182e0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
182f0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
18300 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
18310 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
18320 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
18330 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18340 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
18350 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
18360 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
18370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
18380 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
18390 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
183a0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
183b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
183c0 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
183d0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
183e0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
183f0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
18400 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
18410 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
18420 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
18430 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
18440 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
18450 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
18460 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
18470 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
18480 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
18490 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
184a0 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
184b0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
184c0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
184d0 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
184e0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
184f0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
18500 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
18510 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
18520 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
18530 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18540 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
18550 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
18560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
18570 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
18580 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
18590 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
185a0 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
185b0 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
185c0 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
185d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
185e0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
185f0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
18600 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
18610 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
18620 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
18630 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
18640 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
18650 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
18660 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
18670 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
18680 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
18690 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
186a0 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
186b0 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
186c0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
186d0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
186e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
186f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
18700 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
18710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18720 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
18730 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
18740 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
18750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
18760 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
18770 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
18780 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
18790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
187a0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
187b0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
187c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
187d0 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
187e0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
187f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18800 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
18810 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
18820 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
18830 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
18840 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
18850 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
18860 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
18870 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
18880 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
18890 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
188a0 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
188b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
188c0 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
188d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
188e0 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
188f0 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
18900 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
18910 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
18920 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
18930 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
18940 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
18950 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
18960 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
18970 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
18980 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
18990 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
189a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
189b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
189c0 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
189d0 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
189e0 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
189f0 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
18a00 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
18a10 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
18a20 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
18a30 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
18a40 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
18a50 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
18a60 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
18a70 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
18a80 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
18a90 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
18aa0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
18ab0 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
18ac0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18ad0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
18ae0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
18af0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
18b00 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
18b10 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18b20 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
18b30 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
18b40 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
18b50 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
18b60 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18b70 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
18b80 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
18b90 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
18ba0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
18bb0 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
18bc0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
18bd0 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
18be0 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
18bf0 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
18c00 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
18c10 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
18c20 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
18c30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
18c40 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
18c50 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
18c60 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
18c70 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
18c80 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
18c90 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
18ca0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
18cb0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
18cc0 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
18cd0 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
18ce0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
18cf0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
18d00 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
18d10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
18d20 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
18d30 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
18d40 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
18d50 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
18d60 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
18d70 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
18d80 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
18d90 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
18da0 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
18db0 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
18dc0 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
18dd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
18de0 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
18df0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
18e00 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
18e10 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
18e20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
18e30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18e40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18e50 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
18e60 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
18e70 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
18e80 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
18e90 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
18ea0 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
18eb0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18ec0 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
18ed0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
18ee0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
18ef0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
18f00 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
18f10 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18f40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18f50 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
18f60 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
18f70 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18f80 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
18f90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
18fa0 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
18fb0 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
18fc0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
18fd0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
18fe0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
18ff0 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
19000 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19010 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
19020 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
19030 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
19040 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19050 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
19060 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
19070 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19080 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
19090 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
190a0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
190b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
190c0 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
190d0 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
190e0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
190f0 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
19100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
19110 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
19120 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
19130 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
19140 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
19150 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
19160 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
19170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
19180 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
19190 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
191a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
191b0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
191c0 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
191d0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
191e0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
191f0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
19200 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
19210 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
19220 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
19230 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
19240 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
19250 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
19260 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19270 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
19280 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
19290 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
192a0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
192b0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
192c0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
192d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
192e0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
192f0 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
19300 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
19310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19320 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19330 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
19340 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
19350 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
19360 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
19370 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
19380 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
19390 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
193a0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
193b0 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
193c0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
193d0 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
193e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
193f0 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
19400 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
19410 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
19420 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
19430 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
19440 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19450 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
19460 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
19470 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19480 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19490 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
194a0 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
194b0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
194c0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
194d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
194e0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
194f0 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
19500 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
19510 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
19520 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19530 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
19540 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19550 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20   }.  zMasterPtr 
19560 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
19570 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
19580 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
19590 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
195a0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
195b0 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
195c0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66  ournal, 0);.  if
195d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
195e0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
195f0 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  _out;.  zMasterJ
19600 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
19610 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a  urnal] = 0;..  z
19620 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
19630 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c  rJournal;.  whil
19640 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
19650 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
19660 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
19670 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
19680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19690 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
196a0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
196b0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
196c0 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20  xists);.    if( 
196d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
196e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
196f0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
19700 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20  .    if( exists 
19710 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ){.      /* One 
19720 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
19730 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
19740 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19750 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a   exists..      *
19760 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
19770 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
19780 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
19790 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
197a0 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
197b0 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
197c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
197d0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
197e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  /.      int c;. 
197f0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
19800 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
19810 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
19820 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
19830 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
19840 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19850 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
19860 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
19870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19890 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
198a0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
198b0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
198c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
198d0 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
198e0 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
198f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
19900 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
19910 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19920 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19930 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
19940 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
19950 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
19960 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
19970 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
19980 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
19990 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
199a0 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
199b0 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
199c0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
199d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
199e0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
199f0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19a00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19a10 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
19a20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
19a30 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
19a40 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
19a50 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
19a60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
19a70 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
19a80 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
19a90 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
19aa0 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
19ab0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
19ac0 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
19ad0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
19ae0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
19af0 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
19b00 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
19b10 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
19b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19b30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
19b40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
19b50 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
19b60 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
19b70 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
19b80 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
19b90 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
19ba0 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
19bb0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
19bc0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
19bd0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
19be0 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
19bf0 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
19c00 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
19c10 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
19c20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
19c30 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
19c40 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
19c50 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
19c60 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
19c70 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
19c80 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
19c90 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
19ca0 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
19cb0 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
19cc0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
19cd0 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
19ce0 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
19cf0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
19d00 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
19d10 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
19d20 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
19d30 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
19d40 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
19d50 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
19d60 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
19d70 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
19d80 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
19d90 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
19da0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
19db0 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
19dc0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
19dd0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
19de0 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
19df0 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
19e00 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
19e10 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
19e20 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
19e30 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
19e40 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
19e50 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
19e60 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
19e70 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
19e80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
19e90 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
19ea0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
19eb0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
19ec0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
19ed0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
19ee0 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
19ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19f00 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
19f10 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
19f20 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
19f30 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
19f40 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
19f50 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
19f60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19f70 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
19f80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
19f90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
19fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19fb0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
19fc0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
19fd0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
19fe0 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
19ff0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1a000 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1a010 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1a020 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1a030 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1a040 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1a050 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1a060 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1a070 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1a080 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1a090 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1a0a0 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1a0b0 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1a0c0 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1a0d0 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1a0e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a0f0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1a100 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1a110 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1a120 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1a130 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1a140 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1a150 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1a160 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1a170 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1a180 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1a190 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1a1a0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1a1b0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1a1c0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1a1d0 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1a1e0 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1a1f0 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1a200 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1a210 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1a220 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1a230 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1a240 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1a250 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1a260 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1a270 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1a280 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1a290 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1a2a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a2b0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1a2c0 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1a2d0 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1a2e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1a2f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a310 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1a320 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1a330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1a360 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1a370 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1a380 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1a390 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1a3a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1a3b0 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1a3c0 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1a3d0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1a3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1a3f0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1a400 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1a410 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1a420 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1a430 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1a440 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1a450 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1a460 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1a470 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1a480 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1a490 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1a4a0 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1a4b0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1a4c0 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1a4d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a4e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1a4f0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1a500 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1a510 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1a520 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1a530 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1a540 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1a550 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1a560 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1a570 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1a580 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1a590 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1a5a0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1a5b0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1a5c0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1a5d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a5e0 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1a5f0 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1a600 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1a610 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1a620 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a630 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1a640 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1a650 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1a660 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1a670 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1a680 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a690 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1a6a0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a6b0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1a6c0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1a6d0 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1a6e0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1a6f0 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1a700 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1a710 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1a720 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1a730 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1a740 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1a750 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1a760 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a770 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1a780 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1a790 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1a7a0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1a7b0 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1a7c0 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1a7d0 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1a7e0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1a7f0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1a800 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1a810 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1a820 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1a830 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1a840 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1a850 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1a860 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1a870 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1a880 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1a890 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1a8a0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1a8b0 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1a8c0 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1a8d0 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1a8e0 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1a8f0 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1a900 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1a910 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1a920 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1a930 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1a940 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1a950 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a960 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1a970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a980 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1a990 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1a9a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1a9b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1a9c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a9d0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1a9e0 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1a9f0 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1aa00 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1aa10 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1aa30 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1aa40 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1aa50 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1aa60 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1aa70 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1aa80 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1aa90 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1aaa0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1aab0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1aac0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1aad0 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1aae0 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1aaf0 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1ab00 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1ab10 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1ab20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1ab30 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1ab40 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1ab50 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1ab60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1ab70 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1ab80 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1ab90 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1aba0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1abb0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1abc0 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1abd0 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1abe0 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1abf0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1ac00 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1ac10 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1ac20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1ac30 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1ac40 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1ac50 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1ac60 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1ac70 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1ac80 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1ac90 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1aca0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1acb0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1acc0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1acd0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1ace0 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1acf0 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1ad00 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1ad10 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1ad20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1ad30 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1ad40 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1ad50 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1ad60 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1ad70 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1ad80 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1ad90 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1ada0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1adb0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1adc0 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1add0 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1ade0 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1adf0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1ae00 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ae10 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1ae20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1ae30 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1ae40 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1ae50 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1ae60 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ae70 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1ae80 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1ae90 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1aea0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1aeb0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1aec0 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1aed0 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1aee0 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1aef0 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1af00 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1af10 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1af20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1af30 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1af40 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1af50 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1af60 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1af70 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1af80 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1af90 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1afa0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1afb0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1afc0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1afd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1afe0 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1aff0 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1b000 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1b010 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1b020 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1b030 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1b040 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1b050 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1b060 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1b070 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1b080 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1b090 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1b0a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1b0b0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1b0c0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1b0d0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1b0e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1b0f0 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1b100 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1b110 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1b120 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1b130 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1b140 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1b150 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1b160 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1b170 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1b180 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1b190 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1b1a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1b1b0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1b1c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1b1d0 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1b1e0 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1b1f0 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1b200 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1b210 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1b220 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1b230 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1b240 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1b250 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1b260 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1b270 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1b280 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1b290 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1b2a0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1b2b0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1b2c0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1b2d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1b2e0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1b2f0 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1b300 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1b310 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1b320 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1b330 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1b340 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1b350 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1b360 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1b370 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1b380 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b390 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1b3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1b3b0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1b3c0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1b3d0 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1b3e0 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1b3f0 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1b400 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1b410 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1b420 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1b430 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1b440 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1b450 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1b460 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1b470 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1b480 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1b490 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1b4a0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1b4b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1b4c0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1b4d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1b4e0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1b4f0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1b500 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1b510 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1b520 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1b530 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1b540 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1b550 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1b560 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1b570 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1b580 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1b590 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1b5a0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1b5b0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1b5c0 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1b5d0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1b5e0 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1b5f0 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1b600 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1b610 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1b620 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1b630 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1b640 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1b650 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1b660 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1b670 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1b680 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1b690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1b6a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1b6b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1b6c0 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1b6d0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1b6e0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1b6f0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1b700 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b720 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1b730 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1b740 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b750 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1b760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1b770 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1b780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1b790 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1b7a0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1b7b0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1b7c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1b7d0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1b7e0 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1b7f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1b800 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b810 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1b820 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1b830 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1b840 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1b850 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1b860 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1b870 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1b880 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1b890 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1b8a0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1b8b0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1b8c0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1b8d0 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1b8e0 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1b8f0 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1b900 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1b910 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1b920 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1b930 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1b940 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a  rom journal */..
1b950 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1b960 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1b970 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1b980 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1b990 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1b9a0 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1b9b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1b9c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1b9d0 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1b9e0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1b9f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1ba00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1ba10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1ba20 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1ba30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1ba40 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1ba50 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1ba60 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1ba70 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1ba80 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1ba90 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1baa0 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1bab0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1bac0 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1bad0 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1bae0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1baf0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1bb00 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1bb10 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1bb20 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1bb30 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1bb40 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1bb50 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1bb60 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1bb70 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1bb80 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1bb90 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1bba0 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1bbb0 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1bbc0 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1bbd0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bbe0 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1bbf0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1bc00 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
1bc10 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1bc20 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1bc30 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1bc40 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1bc50 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1bc60 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1bc70 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1bc80 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1bc90 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1bca0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1bcb0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1bcc0 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1bcd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bce0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1bcf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1bd00 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1bd10 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1bd20 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1bd30 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1bd40 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1bd50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1bd60 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1bd70 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1bd80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1bd90 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1bda0 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1bdb0 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1bdc0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1bdd0 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1bde0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1bdf0 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1be00 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1be10 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1be20 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1be30 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1be40 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1be50 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1be60 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1be70 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1be80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1be90 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1bea0 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1beb0 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1bec0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1bed0 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1bee0 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1bef0 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1bf00 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1bf10 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1bf20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1bf30 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1bf40 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1bf50 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1bf60 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bf70 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1bf80 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1bf90 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1bfa0 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1bfb0 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1bfc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1bfd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1bfe0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1bff0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c000 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1c010 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c020 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1c030 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c040 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1c050 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1c060 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1c070 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1c080 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1c090 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1c0a0 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1c0b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1c0c0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1c0d0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1c0e0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1c0f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1c100 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1c110 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1c120 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1c130 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1c140 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1c150 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1c160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c170 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1c180 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1c190 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1c1a0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1c1b0 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1c1c0 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1c1d0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1c1e0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1c1f0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1c200 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1c210 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1c220 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1c230 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1c240 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1c250 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1c260 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1c270 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1c280 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1c290 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1c2a0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1c2b0 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1c2c0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1c2d0 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1c2e0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1c2f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c300 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1c310 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1c320 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c330 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c340 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1c350 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1c360 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1c370 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1c380 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1c390 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1c3a0 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1c3b0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c3c0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1c3d0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1c3e0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1c3f0 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1c400 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1c410 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1c420 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1c430 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1c440 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1c450 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1c460 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1c470 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1c480 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1c490 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1c4a0 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1c4b0 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1c4c0 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1c4d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c4e0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1c4f0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1c500 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1c510 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1c520 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1c530 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1c540 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c550 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1c560 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c570 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1c580 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1c590 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1c5a0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1c5b0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1c5c0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1c5d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c5e0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1c5f0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1c600 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c610 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1c620 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c630 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1c640 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1c650 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c670 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1c680 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1c690 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1c6a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1c6b0 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1c6c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c6d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1c6e0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c6f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1c700 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1c710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1c720 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1c730 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1c740 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1c750 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1c760 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1c770 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1c780 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1c790 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1c7a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1c7b0 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1c7c0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1c7d0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1c7e0 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1c7f0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1c800 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c810 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1c820 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1c830 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1c840 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1c850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c860 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61  .        nPlayba
1c870 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ck++;.      }els
1c880 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
1c890 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1c8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1c8b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c8c0 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1c8d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c8e0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1c8f0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1c900 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1c910 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1c920 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1c930 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1c940 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1c950 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1c960 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1c970 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1c980 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1c990 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1c9a0 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1c9b0 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1c9c0 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1c9d0 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1c9e0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1c9f0 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1ca00 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1ca10 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1ca20 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1ca30 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1ca40 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1ca50 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1ca60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1ca70 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1ca80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ca90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1caa0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1cab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cac0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1cad0 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1cae0 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1caf0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1cb00 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1cb10 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1cb20 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1cb30 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1cb40 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1cb50 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1cb60 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1cb70 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1cb80 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1cb90 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1cba0 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1cbb0 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1cbc0 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1cbd0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1cbe0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1cbf0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1cc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cc10 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1cc20 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1cc30 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1cc40 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1cc50 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1cc60 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1cc70 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1cc80 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1cc90 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1cca0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1ccb0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1ccc0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1ccd0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1cce0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1ccf0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1cd00 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1cd10 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1cd20 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1cd30 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1cd40 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1cd50 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1cd60 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1cd70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1cd80 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1cd90 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1cda0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1cdb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1cdc0 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1cdd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1cde0 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1cdf0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1ce00 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1ce10 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1ce20 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1ce30 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1ce40 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1ce50 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1ce60 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1ce70 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1ce80 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1ce90 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1cea0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ceb0 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1cec0 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1ced0 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1cee0 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1cef0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1cf00 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1cf10 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1cf20 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1cf30 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1cf40 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1cf50 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1cf60 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1cf70 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1cf80 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1cf90 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1cfa0 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1cfb0 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1cfc0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1cfd0 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1cfe0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1cff0 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1d000 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1d010 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1d020 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1d030 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1d040 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1d050 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1d060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d070 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1d080 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1d090 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1d0a0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1d0b0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1d0c0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1d0d0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1d0e0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d0f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d110 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1d120 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1d130 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1d140 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1d150 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1d160 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1d170 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1d180 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1d190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d1a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1d1b0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1d1c0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1d1d0 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1d1e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d1f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d200 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d210 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1d220 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1d230 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1d240 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1d250 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1d260 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1d270 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1d280 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1d290 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1d2a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1d2b0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1d2c0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1d2d0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1d2e0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1d2f0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d300 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d310 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1d320 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1d330 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1d340 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1d350 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1d360 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1d370 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1d380 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1d390 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1d3a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1d3b0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1d3c0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1d3d0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1d3e0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1d3f0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1d400 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1d410 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1d420 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1d430 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1d440 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1d450 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1d460 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1d470 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1d480 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1d490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1d4a0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1d4b0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1d4c0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1d4d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1d4e0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1d4f0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1d500 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1d510 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1d520 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1d530 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1d540 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d550 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1d560 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1d570 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1d580 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1d590 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1d5a0 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1d5b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1d5c0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1d5d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1d5e0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1d5f0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1d600 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1d610 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1d620 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1d630 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1d640 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1d650 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72  dr *pPg, u32 iFr
1d660 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ame){.  Pager *p
1d670 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1d680 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1d690 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1d6a0 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1d6b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1d6c0 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1d6d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1d6e0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1d6f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1d700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d710 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1d720 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1d730 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1d740 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d750 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1d760 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1d770 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1d780 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1d790 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1d7a0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69  ager->fd) );..#i
1d7b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d7c0 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61  T_WAL.  if( iFra
1d7d0 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  me ){.    /* Try
1d7e0 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67   to pull the pag
1d7f0 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65  e from the write
1d800 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20  -ahead log. */. 
1d810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1d820 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67  alReadFrame(pPag
1d830 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65  er->pWal, iFrame
1d840 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61  , pgsz, pPg->pDa
1d850 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ta);.  }else.#en
1d860 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  dif.  {.    i64 
1d870 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1d880 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1d890 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1d8a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1d8b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1d8c0 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1d8d0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1d8e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1d8f0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1d900 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d910 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1d920 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1d930 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1d940 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d950 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1d960 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1d970 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1d980 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1d990 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1d9a0 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1d9b0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1d9c0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1d9d0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1d9e0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1d9f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1da00 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1da10 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1da20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1da30 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1da40 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1da50 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1da60 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1da70 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1da80 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1da90 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1daa0 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1dab0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1dac0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1dad0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1dae0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1daf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1db00 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1db10 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1db20 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1db30 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1db40 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1db50 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1db60 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1db70 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1db80 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1db90 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65    ** white noise
1dba0 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1dbb0 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1dbc0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1dbd0 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1dbe0 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1dbf0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1dc00 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1dc10 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1dc20 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1dc30 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1dc40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc50 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1dc60 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1dc70 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1dc80 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1dc90 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1dca0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1dcb0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1dcc0 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1dcd0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1dce0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
1dcf0 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1dd00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20  _NOMEM_BKPT);.. 
1dd10 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1dd20 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1dd30 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1dd40 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1dd50 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1dd60 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1dd70 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1dd80 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1dd90 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1dda0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1ddc0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1ddd0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1dde0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1ddf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1de00 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1de10 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1de20 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1de30 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1de40 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1de50 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1de60 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1de70 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1de80 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1de90 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1dea0 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1deb0 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1dec0 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1ded0 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1dee0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1def0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1df00 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1df10 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1df20 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1df30 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1df40 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1df50 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1df60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1df70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1df80 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1df90 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1dfa0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1dfb0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1dfc0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1dfd0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1dfe0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1dff0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1e000 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1e010 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1e020 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e030 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1e040 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e050 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1e060 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1e070 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1e080 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1e090 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1e0a0 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1e0b0 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1e0c0 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1e0d0 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1e0e0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1e0f0 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1e100 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1e110 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1e120 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1e130 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1e140 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1e150 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1e160 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1e170 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1e180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1e190 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1e1a0 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1e1b0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1e1c0 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1e1d0 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1e1e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1e1f0 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1e200 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e210 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1e220 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1e230 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1e240 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1e250 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1e260 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1e270 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1e280 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e290 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1e2a0 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1e2b0 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1e2c0 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1e2d0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1e2e0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1e2f0 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1e300 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1e310 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1e320 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1e330 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1e340 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1e350 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1e360 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1e370 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1e380 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e390 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1e3a0 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1e3b0 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1e3c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e3d0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1e3e0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1e3f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1e400 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1e410 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1e420 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e430 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1e440 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1e450 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1e460 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1e470 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e480 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1e490 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1e4a0 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1e4b0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1e4c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1e4d0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1e4e0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1e4f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1e500 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1e510 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
1e520 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rame = 0;.      
1e530 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e540 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1e550 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1e560 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1e570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e590 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1e5a0 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
1e5b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e5c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e5d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e5e0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1e5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e600 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1e610 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1e620 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1e630 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1e640 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e650 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1e660 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1e670 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1e680 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1e690 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1e6a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1e6b0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1e6c0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1e6d0 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1e6e0 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1e6f0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1e700 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1e710 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1e720 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1e730 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1e740 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1e750 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1e760 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1e770 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1e780 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1e790 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1e7a0 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1e7b0 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1e7c0 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1e7d0 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1e7e0 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1e7f0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1e800 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1e810 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1e820 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1e830 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e840 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e850 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1e860 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e870 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1e880 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e890 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1e8a0 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1e8b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e8e0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1e8f0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e910 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1e920 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1e930 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1e940 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1e950 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1e960 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1e970 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1e980 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1e990 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1e9a0 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1e9b0 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1e9c0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1e9d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1e9e0 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1e9f0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1ea00 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1ea10 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1ea20 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1ea30 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1ea40 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1ea50 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1ea60 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1ea70 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1ea80 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1ea90 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1eaa0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1eab0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1eac0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ead0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1eae0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1eaf0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1eb00 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1eb10 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1eb20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1eb30 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1eb40 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1eb50 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1eb60 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1eb70 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1eb80 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1eb90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1eba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ebb0 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1ebc0 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1ebd0 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1ebe0 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1ebf0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1ec00 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1ec10 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1ec20 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1ec30 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1ec40 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1ec50 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1ec60 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1ec70 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1ec80 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1ec90 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1eca0 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1ecb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ecc0 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1ecd0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1ece0 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1ecf0 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1ed00 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1ed10 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1ed20 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1ed30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1ed40 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1ed50 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1ed60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ed70 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1ed80 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1edb0 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1edc0 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ede0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1edf0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1ee00 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1ee10 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1ee20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ee30 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1ee40 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1ee50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ee70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1ee80 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eea0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1eeb0 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50   in pList */.  P
1eec0 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eee0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1eef0 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61  er pages */..  a
1ef00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1ef10 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1ef20 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1ef30 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ef40 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1ef50 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1ef60 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1ef70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1ef80 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1ef90 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1efa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1efb0 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1efc0 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1efd0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1efe0 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1eff0 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1f000 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1f010 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1f020 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1f030 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1f040 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1f050 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1f060 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1f070 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1f080 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1f090 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1f0a0 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1f0b0 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1f0c0 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1f0d0 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1f0e0 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1f0f0 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1f100 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1f110 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65      PgHdr **ppNe
1f120 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20  xt = &pList;.   
1f130 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
1f140 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70  for(p=pList; (*p
1f150 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70  pNext = p)!=0; p
1f160 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f170 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1f180 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  nTruncate ){.   
1f190 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70       ppNext = &p
1f1a0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
1f1b0 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20    nList++;.     
1f1c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1f1d0 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1f1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74  }else{.    nList
1f1f0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 1;.  }.  pPag
1f200 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
1f210 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e  STAT_WRITE] += n
1f220 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69  List;..  if( pLi
1f230 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1f240 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1f250 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1f260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f270 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1f280 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1f290 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1f2a0 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1f2b0 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65   isCommit, pPage
1f2c0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  r->walSyncFlags.
1f2d0 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
1f2e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1f2f0 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
1f300 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1f310 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1f320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1f330 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1f340 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1f350 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1f360 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1f370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f380 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
1f390 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1f3a0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f3b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f3c0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f3d0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f3e0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
1f3f0 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
1f400 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1f410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1f420 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1f430 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1f440 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f450 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1f460 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1f470 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1f480 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1f490 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1f4a0 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1f4b0 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1f4c0 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1f4d0 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1f4e0 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1f4f0 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1f500 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1f510 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1f520 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1f530 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1f540 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1f550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f560 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
1f570 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
1f580 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f5b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1f5c0 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5e0 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
1f5f0 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
1f600 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1f610 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1f620 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f630 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f640 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
1f650 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
1f660 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
1f670 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f680 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
1f690 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
1f6a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
1f6b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1f6c0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
1f6d0 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
1f6e0 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
1f6f0 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
1f700 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
1f710 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
1f720 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
1f730 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
1f740 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
1f750 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
1f760 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
1f770 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f780 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1f790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f7a0 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
1f7b0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f7c0 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
1f7d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f7e0 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
1f7f0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1f800 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1f810 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
1f820 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
1f830 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
1f840 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1f850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f860 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1f870 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f880 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1f890 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1f8a0 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1f8b0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1f8c0 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1f8d0 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1f8e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f8f0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1f900 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1f910 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1f920 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1f930 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1f940 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1f950 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1f960 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1f970 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f980 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1f990 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1f9a0 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1f9b0 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1f9c0 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1f9d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f9e0 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1f9f0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1fa00 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1fa10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1fa20 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1fa30 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1fa40 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1fa50 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1fa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1fa70 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1fa80 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1fa90 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1faa0 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1fab0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1fac0 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1fad0 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1fae0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1faf0 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1fb00 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1fb10 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1fb20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1fb30 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1fb40 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1fb50 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1fb60 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1fb70 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1fb80 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1fb90 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1fba0 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1fbb0 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1fbc0 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1fbd0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1fbe0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fbf0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1fc00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fc10 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1fc20 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67  D_LOCK );.  nPag
1fc30 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
1fc40 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1fc50 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
1fc60 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1fc70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1fc80 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1fc90 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  e from the.  ** 
1fca0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20  WAL sub-system, 
1fcb0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61  determine the pa
1fcc0 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64 20  ge counte based 
1fcd0 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  on the size of. 
1fce0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1fcf0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73   file.  If the s
1fd00 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fd10 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1fd20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  an.  ** integer 
1fd30 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
1fd40 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64  page-size, round
1fd50 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   up the result..
1fd60 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1fd70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1fd80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1fd90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fda0 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1fdb0 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1fdc0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1fdd0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1fde0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1fdf0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1fe00 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1fe10 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1fe20 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1fe30 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1fe40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fe50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fe60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fe70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1fe80 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1fe90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fea0 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1feb0 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1fec0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1fed0 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1fee0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1fef0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ff00 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1ff10 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1ff20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1ff30 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1ff40 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1ff50 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1ff60 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1ff70 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1ff80 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1ff90 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1ffa0 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1ffb0 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1ffc0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1ffd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1ffe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1fff0 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
20000 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
20010 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
20020 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
20030 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
20040 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
20050 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20060 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
20070 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
20080 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
20090 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
200a0 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
200b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
200c0 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
200d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
200e0 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
200f0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
20100 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
20110 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
20120 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
20130 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
20140 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
20150 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
20160 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
20170 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
20180 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
20190 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
201a0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
201b0 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
201c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
201d0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
201e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
201f0 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
20200 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
20210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20220 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
20230 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
20240 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
20250 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
20260 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
20270 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
20280 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
20290 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
202a0 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
202b0 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
202c0 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
202d0 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
202e0 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
202f0 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
20300 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
20310 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
20320 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
20330 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
20340 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
20350 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
20360 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20370 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20380 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
20390 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
203a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
203b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
203c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
203d0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
203e0 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
203f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20400 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
20410 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
20420 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
20430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20440 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20450 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
20460 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
20470 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
20480 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20490 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
204a0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
204b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
204c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
204d0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
204e0 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
204f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20500 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
20510 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
20520 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
20530 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
20540 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
20550 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
20560 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
20570 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
20580 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
20590 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
205a0 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
205b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
205c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
205d0 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
205e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
205f0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
20600 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
20610 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
20620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20630 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
20640 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
20650 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
20660 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
20670 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20680 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
20690 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
206a0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
206b0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
206c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
206d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
206e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
206f0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
20700 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
20710 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
20720 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
20730 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
20740 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
20750 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
20760 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20770 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
20780 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
20790 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
207a0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
207b0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
207c0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
207d0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
207e0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
207f0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
20800 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
20810 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20820 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
20830 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
20840 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
20850 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
20860 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
20870 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
20880 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
20890 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
208a0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
208b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
208c0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
208d0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
208e0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
208f0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20900 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
20910 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20920 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
20930 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
20940 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20950 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
20960 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20970 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
20980 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
20990 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
209a0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
209b0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
209c0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
209d0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
209e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
209f0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
20a00 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
20a10 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
20a20 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20a30 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
20a40 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20a50 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
20a60 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
20a70 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
20a80 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20a90 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
20aa0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20ab0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20ac0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20ad0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20ae0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20af0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20b00 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20b10 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
20b20 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
20b30 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
20b40 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
20b50 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
20b60 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
20b70 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20b80 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20b90 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20ba0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20bb0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20bc0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20bd0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20be0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20bf0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20c00 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20c10 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
20c20 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
20c30 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
20c40 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
20c50 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
20c60 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
20c70 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
20c80 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
20c90 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
20ca0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20cb0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20cc0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20cd0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20ce0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
20cf0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
20d00 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
20d10 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
20d20 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
20d30 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
20d40 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
20d50 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
20d60 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
20d70 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
20d80 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
20d90 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
20da0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20db0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20dc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20dd0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20de0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20df0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20e00 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20e10 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
20e20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
20e30 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20e40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
20e50 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
20e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
20e70 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
20e80 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
20e90 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
20ea0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20eb0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20ec0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20ed0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20ee0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20ef0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20f00 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20f10 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20f20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20f30 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20f50 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20f60 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
20f70 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20f80 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20f90 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
20fa0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20fb0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20fc0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20fd0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20fe0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20ff0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
21000 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
21010 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
21020 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
21030 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
21040 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
21050 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
21060 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
21070 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
21080 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
21090 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
210a0 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
210b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
210c0 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
210d0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
210e0 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
210f0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
21100 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
21110 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
21120 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
21130 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
21140 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21150 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
21160 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
21170 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
21180 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
21190 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
211a0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
211b0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
211c0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
211d0 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
211e0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
211f0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
21200 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
21210 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
21220 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
21230 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
21240 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
21250 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
21260 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
21270 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
21280 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
21290 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
212a0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
212b0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
212c0 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
212d0 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
212e0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
212f0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
21300 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21310 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
21320 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21330 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21340 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
21350 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
21360 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
21370 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
21380 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
21390 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
213a0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
213b0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
213c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
213d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
213e0 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
213f0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
21400 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
21410 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
21420 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
21430 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
21440 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
21450 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
21460 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21470 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
21480 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
21490 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
214a0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
214b0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
214c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
214d0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
214e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
214f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21500 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21510 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
21520 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21530 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21540 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21550 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21560 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21570 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21590 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
215a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
215b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
215c0 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
215d0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
215e0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
215f0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
21600 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
21610 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
21620 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
21630 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
21640 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
21650 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
21660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
21670 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
21680 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
21690 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
216a0 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
216b0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
216c0 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
216d0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
216e0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
216f0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
21700 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
21710 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21720 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21730 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
21740 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21750 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
21760 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
21770 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
21780 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21790 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
217a0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
217b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
217c0 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
217d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
217e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
217f0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21800 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21810 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
21820 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
21830 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
21840 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
21850 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
21860 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
21870 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
21880 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
21890 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
218a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
218b0 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
218c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
218d0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
218e0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
218f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
21900 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
21910 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
21920 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21930 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
21940 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
21950 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
21960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21970 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
21980 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
21990 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
219a0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
219b0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
219c0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
219d0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
219e0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
219f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21a00 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21a10 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
21a30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
21a40 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
21a50 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
21a60 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
21a70 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
21a80 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
21a90 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
21aa0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
21ab0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21ac0 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
21ad0 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
21ae0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
21af0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
21b00 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
21b10 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
21b20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21b30 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21b40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21b50 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
21b60 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
21b70 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21b80 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
21b90 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
21ba0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21bb0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
21bc0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
21bd0 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
21be0 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
21bf0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
21c00 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21c10 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
21c20 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
21c30 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
21c40 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
21c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21c60 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
21c70 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
21c80 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
21c90 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
21ca0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
21cb0 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
21cc0 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
21cd0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21ce0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21cf0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
21d00 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
21d10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
21d30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21d40 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
21d50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21d60 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
21d70 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
21d80 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
21d90 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
21da0 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
21db0 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65  pting to recycle
21dc0 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65   clean and unuse
21dd0 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  d pages..*/.void
21de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21df0 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
21e00 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
21e10 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
21e20 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
21e30 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
21e40 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
21e50 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21e60 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21e70 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
21e80 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
21e90 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
21ea0 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c  empting to spill
21eb0 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61   pages to journa
21ec0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
21ed0 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
21ee0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
21ef0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
21f00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
21f10 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a  cacheSetSpillsiz
21f20 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
21f30 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
21f40 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
21f50 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
21f60 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
21f70 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
21f80 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
21f90 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
21fa0 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
21fb0 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
21fc0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21fd0 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
21fe0 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
21ff0 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
22000 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
22010 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
22020 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
22030 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
22040 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
22050 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
22060 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
22070 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
22080 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22090 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
220a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
220b0 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
220c0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
220d0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
220e0 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
220f0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
22100 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
22110 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
22120 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22130 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
22140 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
22150 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
22160 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
22170 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
22180 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
22190 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
221a0 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
221b0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
221c0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
221d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
221e0 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
221f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
22200 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
22210 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22220 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
22230 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
22240 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
22250 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
22260 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
22270 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
22280 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
22290 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
222a0 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
222b0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
222c0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
222d0 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
222e0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
222f0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
22300 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
22310 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
22320 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
22330 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
22340 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  ..** There are t
22350 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
22360 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
22370 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
22380 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
22390 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
223a0 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
223b0 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
223c0 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
223d0 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
223e0 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
223f0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
22400 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
22410 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
22420 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22430 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
22440 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
22450 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
22460 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
22470 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
22480 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
22490 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
224a0 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
224b0 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
224c0 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
224d0 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
224e0 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
224f0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
22500 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
22510 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
22520 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
22530 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
22540 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
22550 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
22560 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
22570 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
22580 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
22590 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
225a0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
225b0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
225c0 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
225d0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
225e0 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
225f0 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
22600 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
22610 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
22620 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
22630 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
22640 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
22650 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
22660 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
22670 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
22680 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
22690 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
226a0 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
226b0 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
226c0 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
226d0 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
226e0 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
226f0 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
22700 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22710 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
22720 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
22730 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
22740 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
22750 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
22760 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
22770 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
22780 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
22790 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
227a0 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
227b0 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
227c0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
227d0 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
227e0 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
227f0 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
22800 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
22810 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22820 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
22830 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
22840 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
22850 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
22860 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
22870 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
22880 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
22890 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
228a0 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
228b0 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
228c0 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
228d0 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
228e0 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
228f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
22900 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
22910 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
22920 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
22930 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
22940 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
22950 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
22960 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a  th NORMAL..**.**
22970 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
22980 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
22990 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
229a0 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
229b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
229c0 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
229d0 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
229e0 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
229f0 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
22a00 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
22a10 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22a20 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
22a30 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
22a40 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
22a50 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
22a60 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
22a70 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
22a80 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
22a90 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
22aa0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
22ab0 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
22ac0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
22ad0 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
22ae0 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
22af0 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
22b00 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
22b10 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
22b20 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
22b30 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
22b40 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
22b50 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
22b60 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
22b70 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
22b80 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
22b90 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
22ba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22bb0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
22bc0 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
22bd0 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
22be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
22bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
22c00 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
22c10 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
22c20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
22c30 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
22c40 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
22c50 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
22c60 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22c70 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22c80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22c90 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
22ca0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22cb0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
22cc0 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
22cd0 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
22ce0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
22cf0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
22d00 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50  Sync =  level==P
22d10 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22d20 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70  _OFF ?1:0;.    p
22d30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22d40 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53  = level>=PAGER_S
22d50 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20  YNCHRONOUS_FULL 
22d60 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
22d70 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65  ->extraSync = le
22d80 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
22d90 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a  RONOUS_EXTRA ?1:
22da0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
22db0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
22dc0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22dd0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50  lags = 0;.    pP
22de0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22df0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
22e00 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22e10 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29  AGER_FULLFSYNC )
22e20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22e30 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22e40 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
22e50 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22e60 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22e70 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
22e80 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
22e90 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46  PAGER_CKPT_FULLF
22ea0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22eb0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22ec0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22ed0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
22ee0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22ef0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22f00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22f10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22f20 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22f30 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
22f40 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22f50 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22f60 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
22f70 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
22f80 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
22f90 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
22fa0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
22fb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
22fc0 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c  SyncFlags |= WAL
22fd0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
22fe0 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NS;.  }.  if( pg
22ff0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
23000 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
23010 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23020 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
23030 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
23040 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23050 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
23060 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
23070 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
23080 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
23090 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
230a0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
230b0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
230c0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
230d0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
230e0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
230f0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23100 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
23110 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
23120 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
23130 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
23140 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
23150 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
23160 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
23170 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
23180 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
23190 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
231a0 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
231b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
231c0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
231d0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
231e0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
231f0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
23200 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
23210 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
23220 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
23230 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
23240 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
23250 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
23260 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
23270 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
23280 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
23290 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
232a0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
232b0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
232c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
232d0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
232e0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
232f0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23300 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
23310 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
23320 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
23330 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
23340 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
23350 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23360 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
23370 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
23380 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
23390 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
233a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
233b0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
233c0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
233d0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
233e0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
233f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23410 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23420 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23430 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
23440 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
23450 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
23460 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
23470 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
23480 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
23490 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
234a0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
234b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
234c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
234d0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
234e0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
234f0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
23500 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
23510 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
23520 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
23530 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
23540 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
23550 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
23560 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
23570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
23580 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
23590 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
235a0 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
235b0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
235c0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
235d0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
235e0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
235f0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
23600 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
23610 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
23620 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
23630 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
23640 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
23650 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
23660 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
23670 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
23680 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
23690 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
236a0 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
236b0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
236c0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
236d0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
236e0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
236f0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
23700 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
23710 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
23720 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
23730 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
23750 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
23760 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
23770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237a0 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
237b0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
237c0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
237d0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
237e0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
237f0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
23800 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
23810 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
23820 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
23830 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
23840 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
23850 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
23860 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
23870 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
23880 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
23890 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
238a0 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
238b0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
238c0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
238d0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
238e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
238f0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
23900 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
23910 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
23920 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
23930 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
23960 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
23970 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
23980 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
23990 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
239a0 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
239b0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
239c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239e0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
239f0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
23a00 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
23a10 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
23a20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23a30 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
23a40 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
23a50 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
23a60 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23a70 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
23a80 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
23a90 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
23aa0 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
23ab0 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
23ac0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
23ad0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
23ae0 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
23af0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
23b00 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
23b10 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
23b20 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
23b30 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
23b40 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
23b50 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
23b60 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
23b70 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
23b80 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
23b90 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
23ba0 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
23bb0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
23bc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23bd0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
23be0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
23bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23c00 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
23c10 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
23c20 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
23c30 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
23c40 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
23c50 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
23c60 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
23c70 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
23c80 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
23c90 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
23ca0 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
23cb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23cc0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
23cd0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
23ce0 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
23cf0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
23d00 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
23d10 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
23d20 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
23d30 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
23d40 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
23d50 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
23d60 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
23d70 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
23d80 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
23d90 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
23da0 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
23db0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23dc0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
23dd0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
23de0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
23df0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
23e00 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
23e10 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
23e20 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
23e30 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
23e40 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
23e50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23e60 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
23e70 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
23e80 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
23e90 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
23ea0 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
23eb0 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
23ec0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
23ed0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
23ee0 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
23ef0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
23f00 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
23f10 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
23f20 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
23f30 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
23f40 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
23f50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
23f60 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23f70 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
23f80 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
23f90 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
23fa0 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
23fb0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
23fc0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
23fd0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
23fe0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
23ff0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
24000 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
24010 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
24020 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24030 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
24040 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
24050 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
24060 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
24070 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
24080 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
24090 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
240a0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
240b0 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
240c0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
240d0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
240e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
240f0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
24100 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
24110 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
24120 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
24130 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
24140 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
24150 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
24160 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
24170 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
24180 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
24190 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
241a0 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
241b0 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
241c0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
241d0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
241e0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
241f0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
24200 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
24210 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
24220 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
24230 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
24240 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
24250 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
24260 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24270 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
24280 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
24290 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
242a0 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
242b0 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
242c0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
242d0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
242e0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
242f0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
24300 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
24310 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
24320 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
24330 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
24340 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
24350 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
24360 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
24370 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
24380 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
24390 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
243a0 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
243b0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
243c0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
243d0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
243e0 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
243f0 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
24400 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
24410 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
24420 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24430 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
24440 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
24450 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
24460 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
24470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
24490 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
244a0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
244b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
244c0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
244d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
244e0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
244f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24500 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
24510 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
24520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24530 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
24540 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
24550 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
24560 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24580 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
24590 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
245a0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
245b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
245c0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
245d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
245e0 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
245f0 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
24600 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
24610 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
24620 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
24630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
24640 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
24650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
24660 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
24670 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
24680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24690 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
246a0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
246b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
246c0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
246d0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
246e0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
246f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
24700 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
24710 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
24720 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
24730 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
24740 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
24750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24770 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24780 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
24790 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
247a0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
247b0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
247c0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
247d0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
247e0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
247f0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
24800 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
24810 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
24820 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
24830 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
24840 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
24850 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
24860 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
24870 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
24880 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
24890 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
248a0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
248b0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
248c0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
248d0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
248e0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
248f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24900 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24910 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
24920 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
24930 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
24940 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
24950 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
24960 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
24970 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
24980 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
24990 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
249a0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
249b0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
249c0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
249d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
249e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
249f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
24a00 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
24a10 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
24a20 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
24a30 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
24a40 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
24a50 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24a60 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24a70 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24a80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24a90 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
24aa0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
24ab0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24ac0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
24ad0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
24ae0 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
24af0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24b00 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
24b10 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
24b20 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
24b30 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
24b40 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24b50 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
24b60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24b70 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24b80 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24b90 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24ba0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
24bb0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
24bc0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24bd0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
24be0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
24bf0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
24c00 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24c10 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
24c20 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
24c30 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
24c40 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
24c50 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
24c60 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24c70 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24c80 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24c90 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24ca0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24cb0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
24cc0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24cd0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
24ce0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
24cf0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24d00 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
24d10 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
24d20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24d30 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
24d40 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24d50 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
24d60 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24d70 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24d80 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24d90 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24da0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
24db0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
24dc0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24dd0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
24de0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
24df0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24e00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
24e10 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
24e20 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
24e30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
24e40 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
24e50 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
24e60 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
24e70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
24e80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
24e90 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
24ea0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
24eb0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
24ec0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
24ed0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
24ee0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24ef0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
24f00 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24f10 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
24f20 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
24f30 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
24f40 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24f50 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
24f60 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
24f70 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
24f80 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
24f90 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
24fa0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
24fb0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
24fc0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
24fd0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
24fe0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
24ff0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
25000 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
25010 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
25020 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
25030 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
25040 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25050 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
25060 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
25070 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25080 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
25090 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
250a0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
250b0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
250c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
250d0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
250e0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
250f0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
25100 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
25110 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
25120 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
25130 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
25140 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
25150 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
25160 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
25170 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
25180 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
25190 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
251a0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
251b0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
251c0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
251d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
251e0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
251f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25200 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
25210 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
25220 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
25230 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
25240 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
25250 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
25260 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
25270 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
25280 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
25290 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
252a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
252b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
252c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
252d0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
252e0 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
252f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
25300 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
25310 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
25320 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
25330 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
25340 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
25350 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
25360 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
25370 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
25380 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
25390 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
253a0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
253b0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
253c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
253d0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
253e0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
253f0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25400 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25410 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
25420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25430 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
25440 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
25450 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
25460 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
25470 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
25480 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
25490 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
254a0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
254b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
254c0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
254d0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
254e0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
254f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
25500 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
25510 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
25520 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
25530 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
25540 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
25550 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
25560 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
25570 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
25580 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
25590 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
255a0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
255b0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
255c0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
255d0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
255e0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
255f0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
25600 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
25610 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
25620 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25630 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
25640 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25650 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
25660 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
25670 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
25680 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
25690 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
256a0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
256b0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
256c0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
256d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
256e0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
256f0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
25700 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
25710 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25740 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
25750 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25760 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
25770 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
25780 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
25790 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
257a0 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
257b0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
257c0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
257d0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
257e0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
257f0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
25800 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
25810 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
25820 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
25830 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
25840 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
25850 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
25860 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25870 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
25880 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
25890 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
258a0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
258b0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
258c0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
258d0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
258e0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
258f0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
25900 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
25910 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
25920 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
25930 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
25940 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
25950 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
25960 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
25970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
25980 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
25990 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
259a0 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
259b0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
259c0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
259d0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
259e0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
259f0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
25a00 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
25a10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
25a20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
25a30 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
25a40 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
25a50 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25a60 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25a70 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25a80 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25a90 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
25aa0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
25ab0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
25ac0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
25ad0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
25ae0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
25af0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
25b00 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
25b10 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
25b20 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
25b30 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
25b40 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
25b50 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
25b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25b70 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25b80 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25b90 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25ba0 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
25bb0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
25bc0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
25bd0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
25be0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
25bf0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25c00 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
25c10 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
25c20 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
25c30 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
25c40 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
25c50 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
25c60 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25c70 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25c80 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25c90 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25ca0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
25cb0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
25cc0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
25cd0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
25ce0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
25cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25d00 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
25d10 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
25d20 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
25d30 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
25d40 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
25d50 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
25d60 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25d70 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25d80 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25d90 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25da0 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
25db0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
25dc0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
25dd0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
25de0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
25df0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
25e00 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25e10 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25e20 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
25e30 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
25e40 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
25e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
25e60 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25e70 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
25e80 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
25e90 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
25ea0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25eb0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25ed0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
25ee0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
25ef0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
25f00 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25f10 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
25f20 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
25f30 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25f40 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
25f50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
25f60 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
25f70 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
25f80 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
25f90 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
25fa0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
25fb0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
25fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25fd0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
25fe0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
25ff0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
26000 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
26010 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
26020 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
26030 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
26040 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
26050 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
26060 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
26070 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
26080 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
26090 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
260a0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
260b0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
260c0 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
260d0 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
260e0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
260f0 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
26100 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
26110 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
26120 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
26130 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
26140 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
26150 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
26160 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
26170 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
26180 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
26190 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
261a0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
261b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
261c0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
261d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
261e0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
261f0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
26200 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
26210 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
26220 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
26230 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
26240 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26250 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
26260 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
26270 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
26280 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
26290 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
262a0 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
262b0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
262c0 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
262d0 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
262e0 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
262f0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
26300 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
26310 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
26320 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
26330 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
26340 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
26350 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
26360 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
26370 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
26380 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26390 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
263a0 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
263b0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
263c0 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
263d0 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
263e0 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
263f0 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
26400 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
26410 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
26420 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
26430 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
26440 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
26450 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
26460 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26470 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26480 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
26490 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
264a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
264b0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
264c0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
264d0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
264e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
264f0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
26500 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26510 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
26520 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
26530 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
26540 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
26550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
26560 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
26570 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
26580 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
26590 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
265a0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
265b0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
265c0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
265d0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
265e0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
265f0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
26600 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
26610 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
26620 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
26630 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
26640 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
26650 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
26660 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
26670 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
26680 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
26690 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
266a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
266b0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
266c0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
266d0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
266e0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
266f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26710 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
26720 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
26730 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26740 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
26750 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
26760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26790 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
267a0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
267b0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
267c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
267d0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
267e0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
267f0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26800 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
26810 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
26820 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
26830 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
26840 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
26850 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
26860 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
26870 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
26880 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
26890 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
268a0 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
268b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
268c0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
268d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
268e0 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
268f0 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
26900 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
26910 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
26920 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
26930 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
26940 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
26950 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
26960 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
26970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26980 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26990 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
269a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
269b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
269c0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
269d0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
269e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
269f0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
26a00 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a20 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
26a30 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
26a40 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
26a50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
26a60 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26a70 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26a80 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26a90 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
26ab0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26ac0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a  to return */.  .
26ad0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
26ae0 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
26af0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
26b00 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26b10 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
26b20 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26b30 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
26b40 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
26b50 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
26b60 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
26b70 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  r->nExtra);.  }e
26b80 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26b90 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26ba0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26bb0 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
26bc0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
26bd0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26be0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26bf0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26c00 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
26c10 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
26c20 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
26c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26c40 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
26c50 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
26c60 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
26c70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26c80 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26c90 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26ca0 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26cb0 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26cc0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26cd0 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26cf0 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26d00 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26d10 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
26d20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26d30 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
26d40 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
26d50 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
26d60 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
26d70 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26d80 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26d90 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26da0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26db0 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26dc0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26dd0 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
26de0 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
26df0 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
26e00 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
26e10 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
26e20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26e30 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26e40 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
26e50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26e60 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
26e70 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26e80 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
26e90 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
26ea0 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
26eb0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26ec0 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
26ed0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
26ee0 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
26ef0 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
26f00 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26f10 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
26f20 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
26f30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
26f40 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
26f50 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
26f60 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
26f70 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
26f80 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
26f90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
26fa0 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
26fb0 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
26fc0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
26fd0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
26fe0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
26ff0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
27000 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
27010 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
27020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27030 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
27040 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
27050 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
27060 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
27070 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
27080 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
27090 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
270a0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
270b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
270c0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
270d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
270e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
270f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27100 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
27110 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
27120 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
27130 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
27140 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
27150 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
27160 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
27170 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
27180 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
27190 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
271a0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
271b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
271c0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
271d0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
271e0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
271f0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27200 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
27210 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
27220 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27230 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
27240 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
27250 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
27260 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
27270 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
27280 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
27290 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
272a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
272b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
272c0 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
272d0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
272e0 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
272f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27300 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27310 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
27320 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27330 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
27340 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
27350 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
27360 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
27370 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27380 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
27390 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
273a0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
273b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
273c0 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
273d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
273e0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
273f0 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27400 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
27410 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
27420 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
27430 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
27440 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
27450 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
27460 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
27470 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
27480 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
27490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
274a0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
274b0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
274c0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
274d0 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
274e0 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
274f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
27500 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
27510 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
27520 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
27530 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
27540 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
27550 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
27560 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
27570 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
27580 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
27590 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
275a0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
275b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
275c0 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
275d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
275e0 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
275f0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
27600 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
27610 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
27620 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
27630 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
27640 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
27650 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27660 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
27670 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
27680 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
27690 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
276a0 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
276b0 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
276c0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
276d0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
276e0 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
276f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27710 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27720 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
27730 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
27740 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
27750 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
27760 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
27770 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27780 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
27790 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
277a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
277b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
277c0 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
277d0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
277e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
277f0 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27800 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
27810 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
27820 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27830 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
27840 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27850 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
27860 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
27870 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27880 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
27890 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
278a0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
278b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
278c0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
278d0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
278e0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
278f0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27900 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27910 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
27920 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
27930 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
27940 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27950 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
27960 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
27970 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
27980 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27990 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
279a0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
279b0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
279c0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
279d0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
279e0 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
279f0 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27a00 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27a10 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
27a20 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
27a30 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
27a40 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
27a50 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
27a60 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
27a70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27a80 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27a90 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
27aa0 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
27ab0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
27ac0 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
27ad0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
27ae0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
27af0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27b00 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27b10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
27b20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
27b30 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
27b40 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
27b50 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
27b60 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
27b70 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27b80 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27b90 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27ba0 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27bb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27bc0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27bd0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27be0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27bf0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27c00 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27c10 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
27c20 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
27c30 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
27c40 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
27c50 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27c70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27c80 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27c90 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27ca0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27cb0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27cc0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27cd0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27ce0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27cf0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27d00 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27d10 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27d20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27d30 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
27d40 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
27d50 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
27d60 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
27d70 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27d80 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27d90 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27da0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27db0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27dc0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27dd0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
27de0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27df0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
27e00 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
27e10 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
27e20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
27e30 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
27e40 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
27e50 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
27e60 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
27e70 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
27e80 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
27e90 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
27ea0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
27eb0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
27ec0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
27ed0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
27ee0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
27ef0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
27f00 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
27f10 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
27f20 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
27f30 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
27f40 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
27f50 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
27f60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
27f70 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
27f80 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
27f90 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
27fa0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
27fb0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
27fc0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
27fd0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
27fe0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
27ff0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
28000 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
28010 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
28020 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
28030 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28040 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
28050 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28060 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
28070 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
28080 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
28090 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
280a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
280b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
280c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
280d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
280e0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
280f0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
28100 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28110 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
28120 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28130 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
28140 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
28150 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
28160 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
28170 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
28180 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
28190 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
281a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
281b0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
281c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
281d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
281e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
281f0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
28200 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
28210 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28220 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
28230 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
28240 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
28250 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
28260 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
28270 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
28280 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
28290 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
282a0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
282b0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
282c0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
282d0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
282e0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
282f0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
28300 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
28310 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
28320 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
28330 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
28340 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
28350 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
28360 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
28370 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
28380 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28390 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
283a0 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
283b0 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
283c0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
283d0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
283e0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
283f0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
28400 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
28410 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
28420 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
28430 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
28440 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
28450 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
28460 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
28470 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
28480 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
28490 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
284a0 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
284b0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
284c0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
284d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
284e0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
284f0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
28500 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28510 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
28520 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
28530 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
28540 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
28550 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
28560 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
28570 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
28580 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
28590 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
285a0 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
285b0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
285c0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
285d0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
285e0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
285f0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
28600 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
28610 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
28620 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
28630 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
28640 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
28650 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28660 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
28670 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
28680 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
28690 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
286a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
286b0 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
286c0 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
286d0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
286e0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
286f0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
28700 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
28710 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
28720 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
28730 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28740 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
28750 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
28760 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
28770 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
28780 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
28790 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
287a0 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
287b0 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
287c0 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
287d0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
287e0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
287f0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
28800 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
28810 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
28820 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
28830 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
28840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28850 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
28860 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
28870 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
28880 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
28890 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
288a0 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
288b0 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
288c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, 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 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
288f0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
28900 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
28910 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
28920 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
28930 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
28940 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
28950 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
28960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28970 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
28980 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
28990 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
289a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
289b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
289c0 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
289d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
289e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
289f0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
28a00 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
28a10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28a20 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28a30 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
28a40 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
28a50 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
28a60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
28a80 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
28a90 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
28aa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28ab0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28ac0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
28ad0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
28ae0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28af0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
28b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
28b10 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
28b20 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
28b30 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
28b40 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
28b50 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
28b60 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
28b70 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
28b80 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28b90 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
28ba0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
28bb0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
28bc0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
28bd0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
28be0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
28bf0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
28c00 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
28c10 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
28c20 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28c30 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
28c40 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
28c50 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
28c60 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
28c70 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
28c80 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
28c90 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
28ca0 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
28cb0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
28cc0 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
28cd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
28ce0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
28cf0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
28d00 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
28d10 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
28d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
28d30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
28d40 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28d50 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
28d60 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
28d70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28d80 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28d90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28da0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28db0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28dc0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28dd0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
28de0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28df0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28e00 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
28e10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28e30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28e40 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
28e50 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
28e60 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
28e70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
28e80 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
28e90 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28ea0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
28eb0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
28ec0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
28ed0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
28ee0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
28ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28f00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28f10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28f20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
28f30 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
28f40 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
28f50 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28f60 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
28f70 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
28f80 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28f90 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28fa0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
28fb0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
28fc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28fd0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28fe0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28ff0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
29000 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
29010 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
29020 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
29030 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
29040 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
29050 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29070 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
29080 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
29090 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
290a0 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
290b0 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
290c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
290d0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
290e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
290f0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
29100 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
29110 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
29120 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29130 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29140 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
29150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
29160 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
29170 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
29180 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
29190 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
291a0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
291b0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
291c0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
291d0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
291e0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
291f0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
29200 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
29210 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
29220 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
29230 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
29240 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
29250 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
29260 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
29270 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
29280 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
29290 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
292a0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
292b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
292c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
292d0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
292e0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
292f0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
29300 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
29310 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
29320 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
29330 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
29340 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
29350 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
29360 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
29370 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
29380 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
29390 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
293a0 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
293b0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
293c0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
293d0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
293e0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
293f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
29400 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
29410 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
29420 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
29430 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
29440 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
29450 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
29460 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29470 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
29480 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
29490 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
294a0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
294b0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
294c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
294d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
294e0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
294f0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
29500 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
29510 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
29520 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
29530 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
29540 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
29550 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
29560 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
29570 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
29580 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
29590 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
295a0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
295b0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
295c0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
295d0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
295e0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
295f0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
29600 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
29610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
29620 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
29630 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
29640 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
29650 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
29660 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
29670 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
29680 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
29690 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
296a0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
296b0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
296c0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
296d0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
296e0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
296f0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
29700 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
29710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29720 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
29730 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
29740 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
29750 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
29760 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
29770 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
29780 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
29790 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
297a0 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
297b0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
297c0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
297d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
297e0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
297f0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
29800 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29810 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
29820 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
29830 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
29840 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
29850 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
29860 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
29870 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
29880 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
29890 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
298a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
298b0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
298c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
298d0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
298e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
298f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29900 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29910 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
29920 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
29930 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
29940 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
29950 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
29960 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
29970 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
29980 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
29990 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
299a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
299b0 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
299c0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
299d0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
299e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
299f0 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29a00 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29a10 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29a20 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
29a30 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
29a40 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
29a50 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29a60 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
29a70 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29a80 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29a90 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
29aa0 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
29ab0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
29ac0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29ad0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
29ae0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
29af0 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
29b00 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
29b10 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
29b20 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
29b30 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
29b40 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
29b50 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
29b60 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
29b70 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
29b80 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
29b90 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
29ba0 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
29bb0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29bc0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
29bd0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
29be0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29bf0 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
29c00 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
29c10 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
29c20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
29c30 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
29c40 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
29c50 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
29c60 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
29c70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29c80 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
29c90 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
29ca0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
29cb0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
29cc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
29cd0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
29ce0 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
29cf0 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
29d00 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
29d10 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
29d20 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29d30 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
29d40 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
29d50 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
29d60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
29d70 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
29d80 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
29d90 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
29da0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
29db0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
29dc0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
29dd0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
29de0 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
29df0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
29e00 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
29e10 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
29e20 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
29e30 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
29e40 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
29e50 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
29e60 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
29e70 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
29e80 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
29e90 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
29ea0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
29eb0 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
29ec0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
29ed0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
29ee0 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
29ef0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
29f00 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
29f10 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
29f20 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
29f30 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
29f40 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
29f50 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
29f60 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
29f70 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
29f80 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
29fc0 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
29fd0 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
29fe0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29ff0 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2a000 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
2a010 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
2a020 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
2a030 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
2a040 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
2a050 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2a060 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2a070 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
2a080 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
2a090 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2a0a0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
2a0b0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
2a0c0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
2a0d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a0e0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a0f0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
2a100 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a110 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
2a120 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
2a130 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
2a140 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
2a150 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
2a160 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
2a170 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
2a180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a190 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
2a1a0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
2a1b0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
2a1c0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a1d0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
2a1e0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
2a1f0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
2a200 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
2a210 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
2a220 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
2a230 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
2a240 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2a250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a260 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2a270 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2a280 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a290 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
2a2a0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
2a2b0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2a2c0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
2a2d0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
2a2e0 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
2a2f0 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
2a300 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a310 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
2a320 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
2a330 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
2a340 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
2a350 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
2a360 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
2a370 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
2a380 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
2a390 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2a3a0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2a3b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2a3c0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2a3d0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
2a3e0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
2a3f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a400 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
2a410 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2a420 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2a430 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
2a440 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
2a450 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
2a460 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a470 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a480 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2a490 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
2a4a0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
2a4b0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
2a4c0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
2a4d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a4e0 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
2a4f0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2a500 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
2a510 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2a520 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
2a530 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2a540 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2a550 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2a560 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
2a570 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
2a580 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
2a590 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
2a5a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a5b0 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
2a5c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
2a5d0 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
2a5e0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
2a5f0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2a600 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2a610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a620 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2a630 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2a640 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2a650 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2a660 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2a670 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
2a680 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2a690 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
2a6a0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2a6b0 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
2a6c0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
2a6d0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
2a6e0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
2a6f0 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
2a700 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
2a710 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2a720 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
2a730 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
2a740 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2a750 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
2a760 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2a770 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
2a780 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
2a790 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
2a7a0 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
2a7b0 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
2a7c0 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
2a7d0 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
2a7e0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2a7f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2a800 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
2a810 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
2a820 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
2a830 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
2a840 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2a850 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
2a860 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
2a870 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
2a880 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
2a890 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
2a8a0 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
2a8b0 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
2a8c0 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
2a8d0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2a8e0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
2a8f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a900 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
2a910 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a920 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
2a930 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2a940 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a950 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
2a960 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2a970 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
2a980 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
2a990 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
2a9a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a9b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2a9c0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2a9d0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2a9e0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
2a9f0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
2aa00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2aa10 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
2aa20 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
2aa30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2aa40 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2aa50 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
2aa60 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2aa70 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20  ager, pPg) .    
2aa80 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
2aa90 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
2aaa0 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
2aab0 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2aac0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
2aad0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2aae0 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
2aaf0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
2ab00 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
2ab10 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
2ab20 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
2ab30 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2ab40 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
2ab50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ab60 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
2ab70 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
2ab80 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
2ab90 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67  fset = (i64)pPag
2aba0 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
2abb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2abc0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
2abd0 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
2abe0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
2abf0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
2ac00 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
2ac10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
2ac20 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45  ta2);.      PAGE
2ac30 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
2ac40 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2ac50 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2ac60 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2ac70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
2ac80 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2ac90 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
2aca0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2acb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2acc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2acd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2ace0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2acf0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
2ad00 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2ad10 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
2ad20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2ad30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ad40 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2ad50 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
2ad60 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2ad70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
2ad80 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
2ad90 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2ada0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
2adb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2adc0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2add0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2ade0 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b  red(PgHdr *pPg){
2adf0 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69  .  if( subjRequi
2ae00 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2ae10 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f      return subjo
2ae20 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2ae30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2ae40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ae50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2ae60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ae70 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2ae80 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2ae90 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2aea0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2aeb0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2aec0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2aed0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2aee0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2aef0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2af00 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2af10 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2af20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2af30 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2af40 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2af50 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2af60 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2af70 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2af80 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2af90 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2afa0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2afb0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2afc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2afd0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2afe0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2aff0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2b000 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2b010 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2b020 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2b030 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2b040 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2b050 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2b060 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2b070 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2b080 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2b090 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2b0a0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2b0b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2b0c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2b0d0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2b0e0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2b0f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2b100 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2b110 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2b120 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2b130 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2b140 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2b150 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2b160 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2b170 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2b180 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2b190 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2b1a0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2b1b0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2b1c0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2b1d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2b1e0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2b1f0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2b200 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2b210 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2b220 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2b230 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2b240 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2b250 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2b270 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2b280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2b290 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2b2a0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2b2b0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2b2c0 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2b2d0 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2b2e0 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2b2f0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2b300 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2b310 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2b320 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2b330 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2b340 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2b350 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2b360 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2b370 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2b380 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2b390 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2b3a0 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2b3b0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2b3c0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2b3d0 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2b3e0 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2b3f0 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2b400 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2b410 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2b420 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2b430 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2b440 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2b450 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2b460 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2b470 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2b480 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2b490 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2b4a0 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2b4b0 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2b4c0 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2b4d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2b4e0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2b4f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2b500 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2b510 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2b520 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2b530 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2b540 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20   createFlag==3. 
2b550 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2b560 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2b570 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2b580 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2b590 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2b5a0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2b5b0 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2b5c0 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2b5d0 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2b5e0 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2b5f0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2b600 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2b610 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2b620 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2b630 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2b640 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2b650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73  SQLITE_OK;.  tes
2b660 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2b670 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2b680 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29  LFLAG_ROLLBACK )
2b690 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2b6a0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b6b0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46   & SPILLFLAG_OFF
2b6c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b6d0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b6e0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
2b6f0 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70  OSYNC );.  if( p
2b700 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b710 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72  l.   && ((pPager
2b720 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28  ->doNotSpill & (
2b730 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2b740 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  CK|SPILLFLAG_OFF
2b750 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28  ))!=0.      || (
2b760 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2b770 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2b780 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2b790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b7a0 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
2b7b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2b7c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b7d0 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
2b7e0 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2b7f0 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2b800 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  he log. */.    r
2b810 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2b820 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67  geIfRequired(pPg
2b830 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ); .    if( rc==
2b840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b850 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2b860 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2b870 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2b880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
2b890 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2b8a0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
2b8b0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
2b8c0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2b8d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
2b8e0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
2b8f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2b900 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
2b910 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
2b920 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2b930 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
2b940 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2b950 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b960 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
2b970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2b980 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b9a0 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
2b9b0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b9c0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2b9d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2b9e0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
2b9f0 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
2ba00 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
2ba10 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2ba20 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2ba30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ba40 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
2ba50 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
2ba60 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2ba70 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2ba80 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2ba90 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
2baa0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2bab0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2bac0 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a  er, rc); .}../*.
2bad0 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72  ** Flush all unr
2bae0 65 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20  eferenced dirty 
2baf0 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a  pages to disk..*
2bb00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2bb10 65 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70  erFlush(Pager *p
2bb20 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2bb30 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2bb40 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  de;.  if( !MEMDB
2bb50 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
2bb60 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
2bb70 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
2bb80 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2bb90 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
2bba0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2bbb0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68  Pager) );.    wh
2bbc0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2bbd0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
2bbe0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78       PgHdr *pNex
2bbf0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
2bc00 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  y;.      if( pLi
2bc10 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  st->nRef==0 ){. 
2bc20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2bc30 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70  rStress((void*)p
2bc40 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20  Pager, pList);. 
2bc50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69       }.      pLi
2bc60 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  st = pNext;.    
2bc70 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2bc80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
2bc90 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2bca0 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
2bcb0 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
2bcc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
2bcd0 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
2bce0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
2bcf0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
2bd00 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
2bd10 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
2bd20 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
2bd30 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
2bd40 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2bd50 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
2bd60 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2bd70 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
2bd80 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
2bd90 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
2bda0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2bdb0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
2bdc0 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
2bdd0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
2bde0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
2bdf0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
2be00 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
2be10 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
2be20 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
2be30 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
2be40 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
2be50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2be60 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
2be70 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2be80 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
2be90 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2bea0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
2beb0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2bec0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
2bed0 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
2bee0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
2bef0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2bf00 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
2bf10 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
2bf20 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
2bf30 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
2bf40 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
2bf50 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
2bf60 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2bf70 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
2bf80 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2bf90 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2bfa0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2bfb0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2bfc0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2bfd0 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2bfe0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2bff0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2c000 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2c010 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2c020 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2c030 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2c040 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2c050 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2c060 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2c070 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2c080 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2c090 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2c0a0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2c0b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2c0c0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2c0d0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2c0e0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2c0f0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2c100 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2c110 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2c120 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2c130 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2c140 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2c150 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2c160 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2c170 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2c180 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2c190 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2c1a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2c1b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c1c0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2c1d0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2c1e0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2c1f0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2c200 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2c210 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2c220 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2c230 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2c240 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2c250 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2c260 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2c270 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2c280 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2c290 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2c2a0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2c2b0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2c2c0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2c2d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2c2e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c2f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2c300 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2c310 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2c320 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2c330 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2c340 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2c350 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2c360 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2c370 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2c380 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2c390 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2c3a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2c3b0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2c3c0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2c3d0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2c3e0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2c3f0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2c400 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2c410 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2c420 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2c430 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c440 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2c450 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2c460 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2c470 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2c480 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2c490 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2c4a0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2c4b0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2c4c0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2c4d0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2c4e0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2c4f0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2c500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c510 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2c520 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2c530 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2c540 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2c550 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2c560 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2c570 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2c580 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2c590 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2c5a0 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2c5b0 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2c5c0 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2c5d0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2c5e0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2c5f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2c600 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2c610 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2c620 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2c630 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2c640 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2c650 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2c660 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2c670 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2c680 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2c690 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2c6a0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2c6b0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2c6c0 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2c6d0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2c6e0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2c6f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2c700 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2c710 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2c720 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2c730 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2c740 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2c750 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2c760 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c770 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2c780 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2c790 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2c7a0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2c7b0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2c7c0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2c7d0 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2c7e0 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2c7f0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2c800 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2c810 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2c820 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c   */.  journalFil
2c830 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2c840 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2c850 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20  e(pVfs));..  /* 
2c860 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2c870 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2c880 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2c890 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2c8a0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2c8b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c8c0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2c8d0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2c8e0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2c8f0 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2c900 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2c910 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2c920 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2c930 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2c940 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2c950 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2c960 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2c970 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2c980 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2c990 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2c9a0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2c9b0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2c9c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2c9d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2c9e0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2c9f0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2ca00 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2ca10 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2ca20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2ca30 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2ca40 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2ca50 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2ca60 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2ca70 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2ca80 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2ca90 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2caa0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2cab0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2cac0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2cad0 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2cae0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2caf0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2cb00 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2cb10 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2cb20 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2cb30 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2cb40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2cb50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2cb60 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  PT;.    }.    zP
2cb70 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2cb80 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2cb90 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2cba0 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2cbb0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2cbc0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2cbd0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2cbe0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2cbf0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2cc00 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2cc10 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2cc20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2cc30 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2cc40 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2cc50 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2cc60 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2cc70 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2cc80 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2cc90 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2cca0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ccb0 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2ccc0 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2ccd0 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2cce0 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2ccf0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2cd00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2cd10 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2cd20 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2cd30 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2cd40 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2cd50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2cd60 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2cd70 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2cd80 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2cd90 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2cda0 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2cdb0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2cdc0 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2cdd0 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2cde0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2cdf0 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2ce00 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2ce10 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2ce20 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2ce30 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2ce40 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2ce50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2ce60 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2ce70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2ce80 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2ce90 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2cea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ceb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2cec0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2ced0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2cee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2cef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2cf00 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2cf10 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2cf20 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2cf30 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2cf40 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2cf50 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2cf60 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2cf70 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2cf80 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2cf90 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2cfa0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2cfb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2cfc0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2cfe0 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2cff0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2d000 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2d020 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2d030 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2d040 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2d050 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2d060 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2d070 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2d080 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2d090 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2d0a0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2d0b0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2d0c0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2d0d0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2d0e0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2d0f0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2d100 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2d110 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d120 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2d130 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d140 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2d150 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2d160 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2d170 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2d180 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2d190 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2d1a0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2d1b0 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2d1c0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2d1d0 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2d1e0 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2d1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2d200 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2d210 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2d220 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2d230 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2d240 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2d250 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2d260 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2d270 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2d280 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2d290 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2d2a0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2d2b0 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2d2c0 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d2e0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2d2f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d300 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2d310 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2d320 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2d330 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2d340 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2d350 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2d360 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2d370 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d380 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2d390 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2d3a0 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d3b0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2d3c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2d3d0 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  T;.  }.  pPager 
2d3e0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2d3f0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2d400 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2d410 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2d420 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2d430 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2d440 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2d450 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2d460 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d470 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2d480 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2d490 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d4a0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d4b0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2d4c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2d4d0 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2d4e0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d4f0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2d500 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d510 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2d520 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2d530 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2d540 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d550 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2d560 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2d570 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2d580 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2d590 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2d5a0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2d5b0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2d5c0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2d5d0 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2d5e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2d5f0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2d600 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2d610 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2d620 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2d630 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d640 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d650 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2d660 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2d670 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d680 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2d690 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2d6a0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d6b0 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2d6c0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d6d0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d6e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d6f0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2d700 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2d710 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d720 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d730 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d740 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2d750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d760 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2d770 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2d780 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d790 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2d7a0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2d7b0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d7c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2d7d0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2d7e0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d7f0 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2d800 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d810 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d820 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d830 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2d840 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d850 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d860 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2d870 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2d880 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2d890 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2d8a0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2d8b0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2d8c0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d8d0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d8e0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2d910 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2d920 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2d930 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2d940 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2d950 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2d960 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2d970 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2d980 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2d990 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2d9a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2d9b0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2d9c0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2d9d0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2d9e0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2d9f0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2da00 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2da10 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2da20 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2da30 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2da40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2da50 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2da60 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2da70 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2da80 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2da90 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2daa0 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2dab0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2dac0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2dad0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2dae0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2daf0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2db00 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2db10 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2db20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2db30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2db40 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2db50 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2db60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2db70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2db80 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2db90 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2dba0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2dbb0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2dbc0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2dbd0 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2dbe0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dbf0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2dc00 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2dc10 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2dc20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2dc30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2dc40 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2dc50 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2dc60 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2dc70 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2dc80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2dc90 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2dca0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2dcc0 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2dcd0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2dce0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2dcf0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2dd00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2dd10 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2dd20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2dd30 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2dd40 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2dd50 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2dd60 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2dd70 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2dd80 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2dd90 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2dda0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ddb0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2ddc0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2ddd0 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2dde0 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2ddf0 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2de00 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2de10 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2de20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2de30 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2de40 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2de50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2de60 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2de70 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2de80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2de90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2dea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2deb0 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2dec0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2ded0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2dee0 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2def0 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2df00 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2df10 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2df20 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2df30 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2df40 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2df50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2df60 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2df70 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2df80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2df90 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2dfa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2dfb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2dfc0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2dfd0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2dfe0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2dff0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2e000 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2e010 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2e020 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2e030 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2e040 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2e050 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2e060 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2e070 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2e080 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2e090 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2e0a0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2e0b0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2e0c0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2e0d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2e0e0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2e0f0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2e100 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2e110 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2e120 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2e130 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2e140 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2e150 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2e160 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2e170 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2e180 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2e190 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2e1a0 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2e1b0 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2e1c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2e1d0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2e1e0 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e1f0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2e200 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2e210 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2e220 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2e230 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2e240 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d  e in EXCLUSIVE m
2e250 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ode */.    pPage
2e260 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20  r->noLock = 1;  
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e280 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a   Do no locking *
2e290 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  /.    readOnly =
2e2a0 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2e2b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2e2c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2e2d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2e2e0 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2e2f0 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2e300 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2e310 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2e320 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2e330 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2e340 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2e350 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2e360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e380 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2e390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e3a0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2e3b0 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2e3c0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2e3d0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2e3e0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2e3f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2e400 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2e410 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e430 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
2e440 20 29 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   );.    nExtra =
2e450 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2e460 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e470 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2e480 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2e490 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2e4b0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2e4c0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2e4d0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2e4e0 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ache);.  }..  /*
2e4f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2e500 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65  urred above, fre
2e510 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72  e the  Pager str
2e520 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2e530 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2e540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e550 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2e560 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2e570 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2e580 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
2e590 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
2e5a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e5b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2e5c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2e5d0 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2e5e0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2e5f0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2e600 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2e610 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2e620 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2e630 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2e640 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2e650 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2e660 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2e670 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2e680 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2e690 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e6a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2e6b0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e6c0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2e6d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e6e0 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2e6f0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2e700 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2e710 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2e720 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e730 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2e740 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2e750 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2e760 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2e770 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
2e780 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2e790 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2e7a0 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2e7b0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2e7c0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2e7d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2e7e0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2e7f0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2e800 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2e810 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2e820 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2e830 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2e840 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2e850 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2e860 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2e870 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2e880 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2e890 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2e8a0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2e8b0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2e8c0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2e8d0 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2e8e0 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2e8f0 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2e900 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2e910 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2e920 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2e930 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2e940 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2e950 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2e960 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2e970 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2e980 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  xtraSync==0 );. 
2e990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e9a0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2e9b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e9c0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2e9d0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2e9e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2e9f0 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2ea00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2ea10 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2ea20 3d 20 31 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = 1;.#if SQLITE_
2ea30 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 20 20  EXTRA_DURABLE.  
2ea40 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
2ea50 79 6e 63 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  ync = 1;.#else. 
2ea60 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
2ea70 53 79 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Sync = 0;.#endif
2ea80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
2ea90 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2eaa0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
2eab0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2eac0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2ead0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c  YNC_NORMAL | WAL
2eae0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
2eaf0 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  NS;.    pPager->
2eb00 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
2eb10 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2eb20 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  AL;.  }.  /* pPa
2eb30 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2eb40 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2eb50 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2eb60 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2eb70 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2eb80 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2eb90 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2eba0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2ebb0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2ebc0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2ebd0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2ebe0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2ebf0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2ec00 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2ec10 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2ec20 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2ec30 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2ec40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ec50 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2ec60 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2ec70 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2ec80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2ec90 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2eca0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2ecb0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2ecc0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2ecd0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2ece0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2ecf0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2ed00 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2ed10 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2ed20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2ed30 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2ed40 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2ed50 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
2ed60 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
2ed70 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
2ed80 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
2ed90 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2eda0 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2edb0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2edc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2edd0 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
2ede0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2edf0 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
2ee00 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
2ee10 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
2ee20 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
2ee30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2ee40 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2ee50 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74  is still were it
2ee60 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
2ee70 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
2ee80 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
2ee90 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2eea0 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
2eeb0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
2eec0 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
2eed0 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
2eee0 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
2eef0 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
2ef00 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
2ef10 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
2ef20 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
2ef30 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2ef40 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
2ef50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2ef60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ef70 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
2ef80 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
2ef90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2efa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2efb0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
2efc0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2efd0 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
2efe0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2eff0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
2f000 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
2f010 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
2f020 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2f030 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
2f040 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
2f050 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
2f060 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
2f070 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
2f080 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
2f090 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
2f0a0 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
2f0b0 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
2f0c0 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
2f0d0 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
2f0e0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
2f0f0 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
2f100 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
2f110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2f120 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2f130 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
2f140 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
2f150 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2f160 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
2f170 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2f180 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f190 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2f1a0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2f1b0 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2f1c0 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2f1d0 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2f1e0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2f1f0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2f200 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2f210 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2f220 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2f230 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2f240 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2f250 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2f260 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2f270 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f280 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2f290 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2f2a0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2f2b0 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2f2c0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2f2d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f2e0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2f2f0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2f300 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
2f310 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2f320 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2f330 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2f340 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
2f350 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2f360 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
2f370 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
2f380 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
2f390 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
2f3a0 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
2f3b0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f3c0 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
2f3d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
2f3e0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
2f3f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f400 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
2f410 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
2f420 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
2f430 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
2f440 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
2f450 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
2f460 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2f470 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
2f480 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2f490 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
2f4a0 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
2f4b0 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
2f4c0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
2f4d0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
2f4e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2f4f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f500 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
2f510 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
2f520 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2f530 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
2f540 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
2f550 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
2f560 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
2f570 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
2f580 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
2f590 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2f5a0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f5b0 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
2f5c0 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
2f5d0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2f5e0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2f5f0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
2f600 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
2f610 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
2f620 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2f630 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f640 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
2f650 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
2f660 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
2f670 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2f680 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
2f690 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
2f6a0 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
2f6b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2f6c0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
2f6d0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2f6e0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
2f6f0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
2f700 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2f710 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2f720 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2f730 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
2f740 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2f750 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
2f760 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f770 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
2f780 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
2f790 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2f7a0 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
2f7b0 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
2f7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2f7d0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
2f7e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2f7f0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
2f800 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2f810 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2f820 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
2f830 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2f840 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2f850 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
2f860 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
2f870 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f880 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
2f890 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
2f8a0 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
2f8b0 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
2f8c0 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
2f8d0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2f8e0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
2f8f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2f900 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
2f910 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2f920 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
2f930 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
2f940 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
2f950 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2f960 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2f970 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
2f980 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
2f990 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
2f9a0 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
2f9b0 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
2f9c0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2f9d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
2f9e0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
2f9f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
2fa00 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2fa10 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
2fa20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fa30 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
2fa40 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
2fa50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fa60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
2fa70 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
2fa80 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2fa90 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
2faa0 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
2fab0 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
2fac0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
2fad0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
2fae0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
2faf0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
2fb00 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
2fb10 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
2fb20 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
2fb30 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
2fb40 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2fb50 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
2fb60 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
2fb70 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
2fb80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2fb90 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2fba0 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
2fbb0 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
2fbc0 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
2fbd0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2fbe0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
2fbf0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
2fc00 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
2fc10 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
2fc20 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
2fc30 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
2fc40 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
2fc50 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
2fc60 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
2fc70 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
2fc80 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
2fc90 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2fca0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2fcb0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
2fcc0 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
2fcd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fce0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
2fcf0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2fd00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2fd10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fd20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2fd30 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
2fd40 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2fd50 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2fd60 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2fd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fd80 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2fd90 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a  he database is z
2fda0 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a  ero pages in siz
2fdb0 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  e, that means th
2fdc0 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68  at either (1) th
2fdd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
2fde0 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e  rnal is a remnan
2fdf0 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64  t from a prior d
2fe00 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2fe10 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65   same name where
2fe20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2fe30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75  database file bu
2fe40 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  t not the journa
2fe50 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f  l was deleted, o
2fe60 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61  r (2) the initia
2fe70 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  l.        ** tra
2fe80 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f  nsaction that po
2fe90 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61  pulates a new da
2fea0 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20  tabase is being 
2feb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
2fec0 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65       ** In eithe
2fed0 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72  r case, the jour
2fee0 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20  nal file can be 
2fef0 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65  deleted.  Howeve
2ff00 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20  r, take care.   
2ff10 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64       ** not to d
2ff20 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2ff30 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
2ff40 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65  already open due
2ff50 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a   to.        ** j
2ff60 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
2ff70 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  IST..        */.
2ff80 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2ff90 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65  e==0 && !jrnlOpe
2ffa0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
2ffb0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
2ffc0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2ffd0 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
2ffe0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
2fff0 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
30000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30010 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
30020 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
30030 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
30040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30050 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
30060 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
30070 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
30080 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
300a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
300b0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
300c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
300d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
300e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
300f0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
30100 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
30110 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
30120 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
30130 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30140 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
30150 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
30160 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
30170 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
30180 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
30190 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
301a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
301b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
301c0 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
301d0 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
301e0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
301f0 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
30200 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
30210 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
30220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30230 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
30240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30250 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
30260 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
30270 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
30280 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
30290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
302a0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
302b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
302c0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
302d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
302e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
302f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30300 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
30310 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30330 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
30340 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
30350 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
30360 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30370 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
30380 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
30390 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
303a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
303b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
303c0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
303d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
303e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
303f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
30400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30410 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
30420 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
30430 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
30440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
30450 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
30460 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
30470 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
30480 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
30490 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
304a0 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
304b0 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20      ** it has a 
304c0 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
304d0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
304e0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
304f0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
30500 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
30510 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
30520 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
30530 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
30540 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
30550 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
30560 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
30570 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
30580 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
30590 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
305a0 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
305b0 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
305c0 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
305d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
305e0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
305f0 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
30600 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
30610 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
30620 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
30630 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
30640 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
30650 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
30660 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
30670 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
30680 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
30690 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
306a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
306b0 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
306c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
306d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
306e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
306f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30700 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
30710 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30720 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30730 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
30740 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
30750 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
30760 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
30770 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
30780 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20  agerGet() until 
30790 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
307a0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
307b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
307c0 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
307d0 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
307e0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
307f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30800 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
30810 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
30820 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
30830 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
30840 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
30850 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
30860 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
30870 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
30880 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
30890 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
308a0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
308b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
308c0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
308d0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
308e0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
308f0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
30900 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
30910 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
30920 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
30930 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
30940 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
30950 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
30960 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
30970 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
30980 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
30990 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
309a0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
309b0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
309c0 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
309d0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
309e0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
309f0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
30a00 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
30a10 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
30a20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30a30 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
30a40 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
30a50 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
30a60 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
30a70 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
30a80 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
30a90 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
30aa0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
30ab0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
30ac0 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
30ad0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
30ae0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
30af0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
30b00 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
30b10 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
30b20 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
30b30 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
30b40 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
30b50 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
30b60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30b70 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
30b80 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
30b90 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
30ba0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
30bb0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
30bc0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
30bd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
30be0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30bf0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
30c00 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
30c10 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
30c20 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30c30 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
30c40 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
30c50 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
30c60 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
30c70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
30c80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
30c90 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
30ca0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
30cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30cd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30ce0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
30cf0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
30d00 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
30d10 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
30d20 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
30d30 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
30d40 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
30d50 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
30d60 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
30d70 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
30d80 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
30d90 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
30da0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
30db0 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
30dc0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
30dd0 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
30de0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
30df0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
30e00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
30e10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
30e20 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
30e30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
30e40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30e50 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30e60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
30e70 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
30e80 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
30e90 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
30ea0 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
30eb0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
30ec0 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
30ed0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
30ee0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
30ef0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30f00 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
30f10 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
30f20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30f30 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
30f40 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
30f50 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
30f60 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20   !MEMDB );..    
30f70 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
30f80 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
30f90 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
30fa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30fb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
30fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
30fd0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
30fe0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
30ff0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
31000 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31010 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
31020 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
31030 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
31040 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
31050 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
31060 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
31070 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
31080 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
31090 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
310a0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
310b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
310c0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
310d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
310e0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
310f0 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
31100 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
31110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31120 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
31130 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
31140 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
31150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
31160 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
31170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31180 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
31190 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
311a0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
311b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
311c0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
311d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
311e0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
311f0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
31200 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
31210 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
31220 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
31230 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
31240 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
31250 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
31260 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
31270 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
31280 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
31290 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
312a0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
312b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
312c0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
312d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
312e0 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
312f0 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
31300 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
31310 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
31320 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
31330 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
31340 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
31350 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
31360 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
31370 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
31380 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
31390 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
313a0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
313b0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
313c0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
313d0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
313e0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
313f0 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
31400 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
31410 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
31420 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
31430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
31440 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31450 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
31460 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  er is in locking
31470 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
31480 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69  mode, the lock i
31490 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67  s.      ** downg
314a0 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f  raded to SHARED_
314b0 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73  LOCK before this
314c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
314d0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
314e0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
314f0 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
31500 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
31510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
31530 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31540 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49    }. .      /* I
31550 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
31560 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65  ady open and the
31570 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20   file exists on 
31580 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a  disk, open the .
31590 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
315a0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
315b0 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63  access. Write ac
315c0 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64  cess is required
315d0 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20   because .      
315e0 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ** in exclusive-
315f0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
31600 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
31610 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
31620 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  n .      ** and 
31630 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
31640 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
31650 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20  later on. Also, 
31660 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20  write-access .  
31670 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c      ** is usuall
31680 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  y required to fi
31690 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
316a0 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  al in journal_mo
316b0 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20  de=persist .    
316c0 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61    ** mode (and a
316d0 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f  lso for journal_
316e0 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e  mode=truncate on
316f0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a   some systems)..
31700 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31710 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
31720 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
31730 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e   it usually mean
31740 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20  s that some .   
31750 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
31760 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
31770 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
31780 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
31790 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
317a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
317b0 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
317c0 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
317d0 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  , it .      ** m
317e0 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
317f0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
31800 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
31810 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  en this.      **
31820 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
31830 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
31840 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
31850 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
31860 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
31870 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
31890 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
318a0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
318b0 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e  pVfs;.        in
318c0 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20  t bExists;      
318d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
318e0 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
318f0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
31900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31910 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
31920 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
31930 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
31940 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
31950 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20  , &bExists);.   
31960 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31970 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74  ITE_OK && bExist
31980 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
31990 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
319a0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
319b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
319c0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
319d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
319e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
319f0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
31a00 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
31a10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
31a20 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
31a30 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
31a40 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
31a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
31a60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
31a70 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
31a80 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
31a90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31aa0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
31ab0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
31ac0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
31ad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31ae0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
31af0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31b00 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
31b10 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
31b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31b30 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
31b40 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
31b50 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
31b60 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
31b70 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
31b80 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
31b90 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
31ba0 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
31bb0 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
31bc0 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
31bd0 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
31be0 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
31bf0 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
31c00 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
31c10 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
31c20 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a    Sync the hot j
31c30 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31c40 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69  aying.      ** i
31c50 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65  t back since the
31c60 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
31c70 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74  ashed and left t
31c80 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20  he hot journal. 
31c90 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
31ca0 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74   did not sync it
31cb0 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75   and we are requ
31cc0 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73  ired to always s
31cd0 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ync.      ** the
31ce0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
31cf0 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e  playing it back.
31d00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31d10 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
31d20 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31d30 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
31d40 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
31d50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
31d60 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
31d70 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
31d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31da0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
31db0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
31dc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
31dd0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
31de0 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EN;.        }.  
31df0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
31e00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31e10 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
31e20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
31e30 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31e40 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  K);.      }..   
31e50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31e70 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
31e80 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72  s taken if an er
31e90 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
31ea0 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a   trying to open.
31eb0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f          ** or ro
31ec0 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ll back a hot-jo
31ed0 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64  urnal while hold
31ee0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
31ef0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
31f00 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     ** pager_unlo
31f10 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
31f20 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  l be called befo
31f30 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20  re returning to 
31f40 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a  unlock.        *
31f50 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  * the file. If t
31f60 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70  he unlock attemp
31f70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61  t fails, then Pa
31f80 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ger.eLock must b
31f90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  e.        ** set
31fa0 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
31fb0 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e   (see the commen
31fc0 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
31fd0 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20  ine for .       
31fe0 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   ** UNKNOWN_LOCK
31ff0 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78   above for an ex
32000 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20  planation). .   
32010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32020 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67  ** In order to g
32030 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  et pager_unlock(
32040 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65  ) to do this, se
32050 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  t Pager.eState t
32060 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47  o.        ** PAG
32070 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68  ER_ERROR now. Th
32080 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
32090 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20  ly counted as a 
320a0 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20  transition.     
320b0 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73     ** to ERROR s
320c0 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74  tate in the stat
320d0 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65  e diagram at the
320e0 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
320f0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  e,.        ** si
32100 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
32110 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74   the same call t
32120 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
32130 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20   will very.     
32140 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72     ** shortly tr
32150 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67  ansition the pag
32160 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
32170 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c   OPEN state. Cal
32180 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ling.        ** 
32190 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
321a0 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20  te() would fail 
321b0 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c  now, as it shoul
321c0 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  d not be possibl
321d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
321e0 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  be in ERROR stat
321f0 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  e when there are
32200 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e   zero outstandin
32210 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20  g page .        
32220 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20  ** references.. 
32230 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32240 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
32250 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
32260 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32270 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
32280 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32290 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
322a0 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
322b0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
322c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  k==SHARED_LOCK).
322d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
322e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
322f0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
32300 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
32310 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  K).      );.    
32320 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
32330 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
32340 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
32350 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20  haredLock ){.   
32360 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
32370 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
32380 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65  een acquired the
32390 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20  n check to.     
323a0 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64   ** see if the d
323b0 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
323c0 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
323d0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
323e0 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a  changed,.      *
323f0 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  * flush the cach
32400 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53  e.  The hasHeldS
32410 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70  haredLock flag p
32420 72 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f  revents this fro
32430 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72  m.      ** occur
32440 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79  ring on the very
32450 20 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f   first access to
32460 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65   a file, in orde
32470 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20  r to save a.    
32480 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65    ** single unne
32490 63 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f  cessary sqlite3O
324a0 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20  sRead() call at 
324b0 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20  the start-up..  
324c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
324d0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
324e0 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
324f0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
32500 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
32510 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
32520 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
32530 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
32540 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
32550 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
32560 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
32570 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
32580 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
32590 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
325a0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
325b0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
325c0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
325d0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
325e0 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
325f0 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
32600 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
32610 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
32620 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
32630 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
32640 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
32650 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
32660 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
32670 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
32680 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
32690 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
326a0 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
326b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
326c0 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  gno nPage = 0;. 
326d0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
326e0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
326f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
32700 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ;..      rc = pa
32710 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32720 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
32730 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
32740 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20  o failed;..     
32750 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
32760 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
32770 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
32780 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
32790 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
327a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
327b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
327c0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
327d0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
327e0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
327f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32800 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
32810 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
32820 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
32830 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32860 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
32870 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
32880 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
32890 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
328a0 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
328b0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
328c0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
328d0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
328e0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
328f0 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
32900 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
32910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32920 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
32930 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
32940 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
32950 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
32960 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
32970 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
32980 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
32990 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
329a0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
329b0 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
329c0 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
329d0 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
329e0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
329f0 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
32a00 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
32a10 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
32a20 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
32a30 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
32a40 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
32a50 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
32a60 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
32a70 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
32a80 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
32a90 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
32aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
32ab0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
32ac0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32ad0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
32ae0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
32af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
32b10 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
32b20 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
32b30 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
32b40 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
32b50 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
32b60 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
32b70 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
32b80 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
32b90 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
32ba0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
32bb0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
32bc0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
32bd0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
32be0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
32bf0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
32c00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
32c10 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
32c20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
32c30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
32c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32c50 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
32c60 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
32c70 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
32c80 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
32c90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32ca0 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
32cb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
32cc0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
32cd0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
32ce0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
32cf0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
32d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32d10 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
32d20 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
32d30 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
32d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32d50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32d60 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
32d70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
32d80 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
32d90 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ER;.    pPager->
32da0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
32db0 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  k = 1;.  }.  ret
32dc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32dd0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
32de0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
32df0 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
32e00 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
32e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
32e20 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
32e30 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
32e40 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32e50 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
32e60 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
32e70 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
32e80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
32e90 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
32ea0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
32eb0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
32ec0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
32ed0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
32ee0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
32ef0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
32f00 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
32f10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32f20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
32f30 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73  MmapOut==0 && (s
32f40 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
32f50 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
32f60 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20  ache)==0) ){.   
32f70 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
32f80 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
32f90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
32fa0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
32fb0 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  e to page number
32fc0 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70   pgno in pager p
32fd0 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a  Pager (a page.**
32fe0 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74   reference has t
32ff0 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66  ype DbPage*). If
33000 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
33010 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
33020 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
33030 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
33040 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
33050 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
33060 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
33070 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
33080 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
33090 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
330a0 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
330b0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
330c0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
330d0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
330e0 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
330f0 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
33100 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33110 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
33120 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
33130 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
33140 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
33150 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
33160 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
33170 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
33180 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
33190 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
331a0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
331b0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
331c0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
331d0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
331e0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
331f0 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
33200 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
33210 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
33220 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
33230 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
33240 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
33250 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
33260 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
33270 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
33280 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
33290 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
332a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
332b0 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
332c0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
332d0 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
332e0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
332f0 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
33300 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   a .** non-zero 
33310 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
33320 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  as the noContent
33330 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74   parameter and t
33340 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
33350 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
33360 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
33370 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
33380 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
33390 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
333a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
333b0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
333c0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
333d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
333e0 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
333f0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
33400 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
33410 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
33420 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
33430 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
33440 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
33450 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
33460 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
33470 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
33480 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
33490 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
334a0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
334b0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
334c0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
334d0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
334e0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
334f0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
33500 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
33510 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
33520 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
33530 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
33540 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
33550 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
33560 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
33570 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
33580 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
33590 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
335a0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
335b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
335c0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
335d0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
335e0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
335f0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
33600 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
33610 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
33620 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
33630 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
33640 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
33650 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
33660 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
33670 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
33680 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
33690 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
336a0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
336b0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
336c0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
336d0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
336e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
336f0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
33700 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
33710 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
33720 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
33730 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
33740 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
33750 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
33760 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
33770 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
33780 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
33790 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
337a0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
337b0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
337c0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
337d0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
337e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
337f0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
33800 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
33810 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
33820 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
33830 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
33840 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
33850 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
33860 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
33870 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
33880 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
33890 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
338a0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
338b0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
338c0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
338d0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
338e0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
338f0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
33900 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
33910 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
33920 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
33930 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
33940 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
33950 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
33960 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
33970 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
33980 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
33990 65 33 50 61 67 65 72 47 65 74 28 0a 20 20 50 61  e3PagerGet(.  Pa
339a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
339b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
339c0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
339d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
339e0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
339f0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
33a00 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
33a10 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
33a20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
33a30 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
33a40 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
33a50 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
33a60 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
33a70 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69   flags */.){.  i
33a80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33a90 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  K;.  PgHdr *pPg 
33aa0 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d  = 0;.  u32 iFram
33ab0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
33ac0 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
33ad0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c  to read from WAL
33ae0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   file */.  const
33af0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d   int noContent =
33b00 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
33b10 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  GET_NOCONTENT);.
33b20 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65  .  /* It is acce
33b30 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20  ptable to use a 
33b40 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29  read-only (mmap)
33b50 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61   page for any pa
33b60 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70  ge except.  ** p
33b70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69  age 1 if there i
33b80 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
33b90 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74  action open or t
33ba0 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f  he ACQUIRE_READO
33bb0 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61  NLY.  ** flag wa
33bc0 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
33bd0 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73  he caller. And s
33be0 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62  o long as the db
33bf0 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20   is not a .  ** 
33c00 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
33c10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
33c20 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74    */.  const int
33c30 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f   bMmapOk = (pgno
33c40 3e 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70  >1 && USEFETCH(p
33c50 50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50  Pager).   && (pP
33c60 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33c70 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
33c80 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
33c90 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64  _READONLY)).#ifd
33ca0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
33cb0 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72  DEC.   && pPager
33cc0 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64  ->xCodec==0.#end
33cd0 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70  if.  );..  /* Op
33ce0 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a  timization note:
33cf0 20 20 41 64 64 69 6e 67 20 74 68 65 20 22 70 67    Adding the "pg
33d00 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f  no<=1" term befo
33d10 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72  re "pgno==0" her
33d20 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68  e.  ** allows th
33d30 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  e compiler optim
33d40 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74 68  izer to reuse th
33d50 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
33d60 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74   "pgno>1".  ** t
33d70 65 73 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  est in the previ
33d80 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61  ous statement, a
33d90 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67  nd avoid testing
33da0 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a   pgno==0 in the.
33db0 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65    ** common case
33dc0 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c   where pgno is l
33dd0 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arge. */.  if( p
33de0 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d  gno<=1 && pgno==
33df0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
33e00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33e10 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
33e20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33e30 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
33e40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33e50 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33e60 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
33e70 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  ert( noContent==
33e80 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  0 || bMmapOk==0 
33e90 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33ea0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
33eb0 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
33ec0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
33ed0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
33ee0 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61   state, return a
33ef0 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74  n error immediat
33f00 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ely. .  ** Other
33f10 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68  wise, request th
33f20 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
33f30 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f  PCache layer. */
33f40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
33f50 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
33f60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
33f70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
33f90 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72  bMmapOk && pager
33fa0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33fb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
33fc0 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
33fd0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
33fe0 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
33ff0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34000 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
34010 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
34030 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d  bMmapOk && iFram
34040 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f  e==0 ){.      vo
34050 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a  id *pData = 0;..
34060 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34070 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72  e3OsFetch(pPager
34080 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ->fd, .         
34090 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
340a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
340b0 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e, pPager->pageS
340c0 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20  ize, &pData.    
340d0 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
340e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
340f0 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
34100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
34110 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45  tate>PAGER_READE
34120 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  R ){.          p
34130 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
34140 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
34150 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  pgno);.        }
34160 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
34170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
34180 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
34190 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72  reMapPage(pPager
341a0 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26  , pgno, pData, &
341b0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  pPg);.        }e
341c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
341d0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
341e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
341f0 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  )(pgno-1)*pPager
34200 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
34210 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
34220 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b        if( pPg ){
34230 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34240 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
34250 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
34260 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20  pPage = pPg;.   
34270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
34290 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
342a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
342b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
342c0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
342d0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
342e0 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20 20    }..    {.     
342f0 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
34300 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20 20 20  page *pBase;.   
34310 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74     pBase = sqlit
34320 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
34330 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34340 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
34350 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
34360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34370 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74  te3PcacheFetchSt
34380 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43  ress(pPager->pPC
34390 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61  ache, pgno, &pBa
343a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
343b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
343c0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
343d0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  ire_err;.       
343e0 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
343f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20 3d  .          pPg =
34400 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34410 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34420 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
34430 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
34440 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34460 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20    }.      pPg = 
34470 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65  *ppPage = sqlite
34480 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
34490 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
344a0 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29  he, pgno, pBase)
344b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
344c0 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  pPg!=0 );.    }.
344d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
344e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
344f0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
34500 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
34510 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
34520 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
34530 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
34540 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
34550 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
34560 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
34570 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
34580 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
34590 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
345a0 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
345b0 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
345c0 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
345d0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
345e0 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
345f0 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20   pPg==(*ppPage) 
34600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34610 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
34620 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34630 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
34640 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
34650 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  );..  if( pPg->p
34660 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
34670 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
34680 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
34690 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
346a0 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
346b0 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
346c0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
346d0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
346e0 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
346f0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
34700 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
34710 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
34720 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34730 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
34740 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
34750 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
34760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
34770 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
34780 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
34790 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
347a0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
347b0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
347c0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
347d0 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d  d.  */..    pPg-
347e0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
347f0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
34800 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
34810 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
34820 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34830 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
34840 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
34850 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
34860 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
34870 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
34880 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
34890 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
348a0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
348b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
348c0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
348d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
348e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
348f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34900 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34910 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34920 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
34930 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
34940 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34950 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
34960 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
34970 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
34980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
34990 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
349a0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
349b0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
349c0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
349d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
349e0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
349f0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34a00 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34a10 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34a20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
34a30 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
34a40 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
34a50 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
34a60 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
34a70 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
34a80 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
34a90 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
34aa0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
34ab0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
34ac0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
34ad0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
34ae0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34af0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
34b00 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
34b10 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
34b20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34b30 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
34b40 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
34b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
34b60 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34b70 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
34b80 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
34b90 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
34ba0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
34bb0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
34bc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
34bd0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34be0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34bf0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
34c00 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
34c10 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34c20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
34c30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34c50 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
34c60 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
34c70 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
34c80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
34c90 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
34ca0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
34cb0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
34cc0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
34cd0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
34ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
34cf0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34d00 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
34d10 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
34d20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
34d30 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
34d40 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
34d50 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
34d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34d70 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34d80 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34d90 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
34da0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34db0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
34dc0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
34dd0 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
34de0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
34df0 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
34e00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34e10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34e20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34e30 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34e40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34e50 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
34e60 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
34e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34e80 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
34e90 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
34ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34eb0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
34ec0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
34ed0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
34ee0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
34ef0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
34f00 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34f10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34f20 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
34f30 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
34f40 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
34f50 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
34f60 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
34f70 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
34f80 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
34f90 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
34fa0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
34fb0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34fc0 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
34fd0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
34fe0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
34ff0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
35000 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
35010 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
35020 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
35030 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
35040 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
35050 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
35060 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
35070 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
35080 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
35090 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
350a0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
350b0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
350c0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
350d0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
350e0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
350f0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
35100 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
35110 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
35120 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gno){.  sqlite3_
35130 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61  pcache_page *pPa
35140 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
35150 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
35160 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
35170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35180 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
35190 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65    pPage = sqlite
351a0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
351b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
351c0 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  no, 0);.  assert
351d0 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50  ( pPage==0 || pP
351e0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
351f0 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28  redLock );.  if(
35200 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   pPage==0 ) retu
35210 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 0;.  return s
35220 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35230 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
35240 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
35250 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
35260 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
35270 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
35280 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
35290 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
352a0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
352b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
352c0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
352d0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
352e0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
352f0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
35300 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
35310 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
35320 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
35330 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35340 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
35350 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35360 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
35370 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ll(DbPage *pPg){
35380 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
353a0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  =0 );.  pPager =
353b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
353c0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  if( pPg->flags &
353d0 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20   PGHDR_MMAP ){. 
353e0 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d     pagerReleaseM
353f0 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  apPage(pPg);.  }
35400 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
35410 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
35420 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35430 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35440 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73  Pager);.}.void s
35450 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35460 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
35470 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74   if( pPg ) sqlit
35480 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
35490 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ull(pPg);.}../*.
354a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
354b0 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
354c0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
354d0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
354e0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
354f0 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
35500 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
35510 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
35520 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
35530 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
35540 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
35550 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
35560 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
35570 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
35580 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
35590 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
355a0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
355b0 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
355c0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
355d0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
355e0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
355f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
35600 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
35610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35620 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
35630 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
35640 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
35650 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
35660 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
35670 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
35680 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
35690 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
356a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
356b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
356c0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
356d0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
356e0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
356f0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
35700 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
35710 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
35720 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
35730 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
35740 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
35750 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
35760 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
35770 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
35780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
35790 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
357a0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
357b0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
357c0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
357d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
357e0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
357f0 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
35800 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
35810 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
35820 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
35830 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
35840 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
35850 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
35860 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
35870 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
35880 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35890 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
358a0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
358b0 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
358c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
358d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
35900 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
35910 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
35920 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
35930 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
35940 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
35950 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
35960 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35970 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35980 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
35990 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
359a0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
359b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
359c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
359d0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
359e0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
359f0 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
35a00 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35a10 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
35a20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
35a30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35a40 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
35a50 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
35a60 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
35a70 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
35a80 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
35a90 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
35aa0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
35ab0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
35ac0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
35ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35ae0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
35af0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
35b00 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
35b10 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
35b20 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
35b30 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
35b40 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
35b50 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
35b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35b70 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
35b80 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
35b90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35ba0 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
35bb0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
35bc0 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
35bd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
35be0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
35bf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
35c00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35c10 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
35c20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
35c30 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
35c40 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
35c50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
35c60 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
35c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c80 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
35c90 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
35ca0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
35cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
35cc0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
35cd0 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
35ce0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
35cf0 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
35d00 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
35d10 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
35d20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
35d30 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
35d40 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
35d50 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
35d60 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a  ).          );..
35d70 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
35d80 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
35d90 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
35da0 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
35db0 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
35dc0 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
35dd0 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
35de0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
35df0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
35e00 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
35e10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35e20 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53  E_OK ){.#ifdef S
35e30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
35e40 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
35e50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35e60 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
35e70 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
35e80 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35e90 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
35ea0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
35eb0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
35ec0 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
35ed0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35ee0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
35ef0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
35f00 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
35f10 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
35f20 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
35f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
35f40 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
35f50 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
35f60 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
35f70 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
35f80 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
35f90 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
35fa0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
35fb0 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
35fc0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
35fd0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
35fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36000 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
36010 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
36020 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
36030 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
36040 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
36050 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
36060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36070 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
36080 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
36090 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
360a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
360b0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
360c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
360d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
360e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
360f0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
36100 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
36110 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36120 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
36130 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
36140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
36150 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
36160 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36170 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
36180 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
36190 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
361a0 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
361b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
361c0 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
361d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
361e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
361f0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
36200 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
36210 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
36220 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
36230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
36240 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
36250 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
36260 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
36270 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
36280 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
36290 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
362a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
362b0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
362c0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
362d0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
362e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
362f0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
36300 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
36310 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
36320 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
36330 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
36340 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
36350 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
36360 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
36370 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
36380 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
36390 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
363a0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
363b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
363c0 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
363d0 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
363e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
363f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
36400 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
36410 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
36420 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
36430 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
36440 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
36450 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
36460 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
36470 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
36480 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
36490 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
364a0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
364b0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
364c0 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
364d0 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
364e0 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
364f0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
36500 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
36510 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
36520 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
36530 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
36540 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
36550 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
36560 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36570 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
36580 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
36590 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
365a0 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
365b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
365c0 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
365d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
365e0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
365f0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
36600 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
36610 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
36620 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
36630 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
36640 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
36650 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
36660 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
36670 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
36680 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
36690 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
366a0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
366b0 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
366c0 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
366d0 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
366e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
366f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
36700 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
36710 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
36720 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36730 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
36740 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
36750 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
36760 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
36770 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
36780 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
36790 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
367a0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
367b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
367c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
367d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
367e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
367f0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c  (void)sqlite3Wal
36800 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36810 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
36820 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
36830 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
36840 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
36850 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
36860 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
36870 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
36880 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
36890 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
368a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
368b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
368c0 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
368d0 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
368e0 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
368f0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
36900 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
36910 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
36920 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
36930 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
36940 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
36950 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
36960 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
36970 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
36980 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
36990 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
369a0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
369b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
369c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
369d0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
369e0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
369f0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
36a00 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
36a10 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
36a20 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
36a30 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
36a40 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
36a50 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
36a60 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
36a70 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
36a80 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
36a90 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
36aa0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
36ab0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
36ac0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
36ad0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
36ae0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
36af0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
36b00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
36b10 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
36b20 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
36b30 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
36b40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
36b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
36b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36b80 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
36b90 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
36ba0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36bb0 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
36bc0 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
36bd0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36be0 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
36bf0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
36c00 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
36c10 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
36c20 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
36c30 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
36c40 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
36c50 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
36c60 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
36c70 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
36c80 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
36c90 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
36ca0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
36cb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
36cc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
36cd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
36ce0 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
36cf0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
36d00 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
36d10 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
36d20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
36d30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
36d40 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
36d50 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
36d60 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
36d70 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
36d80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36d90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
36da0 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
36db0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36dc0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36dd0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36de0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36df0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
36e00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
36e10 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
36e20 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
36e30 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
36e40 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
36e50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36e60 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36e70 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36e80 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
36e90 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36ea0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36eb0 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
36ec0 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
36ed0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
36ee0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36ef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36f00 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20 70  .** Write page p
36f10 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  Pg onto the end 
36f20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
36f30 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
36f40 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
36f50 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64 64 50  NE int pagerAddP
36f60 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75  ageToRollbackJou
36f70 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
36f80 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
36f90 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
36fa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
36fb0 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a   cksum;.  char *
36fc0 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69 4f  pData2;.  i64 iO
36fd0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
36fe0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
36ff0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
37000 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
37010 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
37020 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74  e that.  ** cont
37030 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
37040 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
37050 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
37060 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 61  erifies.  ** tha
37070 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
37080 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
37090 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
370a0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
370b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
370c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61  >journalHdr<=pPa
370d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
370e0 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50 61 67  );.  CODEC2(pPag
370f0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
37100 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
37110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
37120 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b  M_BKPT, pData2);
37130 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72  .  cksum = pager
37140 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
37150 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20  u8*)pData2);..  
37160 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
37170 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
37180 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37190 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
371a0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
371b0 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
371c0 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
371d0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
371e0 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
371f0 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
37200 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
37210 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
37220 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61  c in.  ** playba
37230 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
37240 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
37250 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
37260 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a  be restored.  **
37270 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
37280 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
37290 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
372a0 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
372b0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75  .  ** then corru
372c0 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
372d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c  ..  */.  pPg->fl
372e0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
372f0 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20  D_SYNC;..  rc = 
37300 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
37310 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70  er->jfd, iOff, p
37320 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Pg->pgno);.  if(
37330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
37350 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
37360 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
37370 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
37380 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29  ageSize, iOff+4)
37390 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
373a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
373b0 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  c;.  rc = write3
373c0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
373d0 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e  d, iOff+pPager->
373e0 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75  pageSize+4, cksu
373f0 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
37400 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37410 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28   rc;..  IOTRACE(
37420 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
37430 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
37440 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
37450 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
37460 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
37470 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
37480 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
37490 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
374a0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  j_count);.  PAGE
374b0 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
374c0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
374d0 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
374e0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41  x)\n",.       PA
374f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
37500 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
37510 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
37520 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
37530 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
37540 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
37550 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37560 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72  ff += 8 + pPager
37570 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50  ->pageSize;.  pP
37580 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
37590 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
375a0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
375b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
375c0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
375d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
375e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63  ->pgno);.  testc
375f0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
37600 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72  NOMEM );.  asser
37610 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
37620 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
37630 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20  OMEM );.  rc |= 
37640 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
37650 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
37660 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  g->pgno);.  asse
37670 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
37680 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
37690 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
376a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
376b0 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
376c0 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
376d0 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
376e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
376f0 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
37700 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
37710 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
37720 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
37730 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
37740 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
37750 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
37760 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
37770 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
37780 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
37790 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
377a0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
377b0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
377c0 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
377d0 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
377e0 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
377f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
37800 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
37810 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
37820 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
37830 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37840 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
37850 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
37860 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
37870 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37880 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
37890 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
378a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
378b0 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
378c0 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
378d0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
378e0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
378f0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
37900 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
37910 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37920 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37930 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
37940 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37950 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
37960 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
37970 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37980 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
37990 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
379a0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
379b0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
379c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
379d0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b  r->errCode==0 );
379e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
379f0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  r->readOnly==0 )
37a00 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ;.  CHECK_PAGE(p
37a10 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  Pg);..  /* The j
37a20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
37a30 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20  s to be opened. 
37a40 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
37a50 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
37a60 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  dy.  ** obtained
37a70 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
37a80 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68  ocks to begin th
37a90 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
37aa0 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a  ion, but the.  *
37ab0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
37ac0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74  al might not yet
37ad0 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69   be open. Open i
37ae0 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73  t now if this is
37af0 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a   the case..  **.
37b00 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e    ** This is don
37b10 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
37b20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
37b30 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65  keDirty() on the
37b40 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68   page. .  ** Oth
37b50 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65  erwise, if it we
37b60 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61  re done after ca
37b70 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
37b80 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20  cheMakeDirty(), 
37b90 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  then.  ** an err
37ba0 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61  or might occur a
37bb0 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75  nd the pager wou
37bc0 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49  ld end up in WRI
37bd0 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
37be0 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73  .  ** with pages
37bf0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
37c00 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
37c10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
37c20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37c30 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
37c40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
37c50 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
37c60 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
37c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37c80 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
37c90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37ca0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
37cb0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
37cc0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
37cd0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37ce0 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ger) );..  /* Ma
37cf0 72 6b 20 74 68 65 20 70 61 67 65 20 74 68 61 74  rk the page that
37d00 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
37d10 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69 72 74  modified as dirt
37d20 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  y. */.  sqlite3P
37d30 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
37d40 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  Pg);..  /* If a 
37d50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37d60 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68 65 6d   is in use, them
37d70 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   make sure the p
37d80 61 67 65 20 74 68 61 74 20 69 73 20 61 62 6f 75  age that is abou
37d90 74 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65  t.  ** to change
37da0 20 69 73 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62   is in the rollb
37db0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  ack journal, or 
37dc0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
37dd0 20 6e 65 77 20 70 61 67 65 20 6f 66 66 0a 20 20   new page off.  
37de0 2a 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66 20 74  ** then end of t
37df0 68 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75  he file, make su
37e00 72 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20  re it is marked 
37e10 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
37e20 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  NC..  */.  asser
37e30 74 28 20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  t( (pPager->pInJ
37e40 6f 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73  ournal!=0) == is
37e50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
37e60 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
37e70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
37e80 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 42 69  .   && sqlite3Bi
37e90 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
37ea0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37eb0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d  al, pPg->pgno)==
37ec0 30 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  0.  ){.    asser
37ed0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
37ee0 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
37ef0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
37f00 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
37f10 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ze ){.      rc =
37f20 20 70 61 67 65 72 41 64 64 50 61 67 65 54 6f 52   pagerAddPageToR
37f30 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70  ollbackJournal(p
37f40 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
37f50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37f60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37f70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
37f80 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
37f90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
37fa0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
37fb0 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OD ){.        pP
37fc0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
37fd0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
37fe0 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
37ff0 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
38000 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
38010 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
38020 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
38030 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
38040 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
38050 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
38060 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
38070 3a 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  :0)));.    }.  }
38080 0a 0a 20 20 2f 2a 20 54 68 65 20 50 47 48 44 52  ..  /* The PGHDR
38090 5f 44 49 52 54 59 20 62 69 74 20 69 73 20 73 65  _DIRTY bit is se
380a0 74 20 61 62 6f 76 65 20 77 68 65 6e 20 74 68 65  t above when the
380b0 20 70 61 67 65 20 77 61 73 20 61 64 64 65 64 20   page was added 
380c0 74 6f 20 74 68 65 20 64 69 72 74 79 2d 6c 69 73  to the dirty-lis
380d0 74 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72  t.  ** and befor
380e0 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 70 61  e writing the pa
380f0 67 65 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  ge into the roll
38100 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57  back journal.  W
38110 61 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20  ait until now,. 
38120 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 70 61   ** after the pa
38130 67 65 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ge has been succ
38140 65 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c  essfully journal
38150 6c 65 64 2c 20 62 65 66 6f 72 65 20 73 65 74 74  led, before sett
38160 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50 47 48  ing the.  ** PGH
38170 44 52 5f 57 52 49 54 45 41 42 4c 45 20 62 69 74  DR_WRITEABLE bit
38180 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
38190 74 68 61 74 20 74 68 65 20 70 61 67 65 20 63 61  that the page ca
381a0 6e 20 62 65 20 73 61 66 65 6c 79 20 6d 6f 64 69  n be safely modi
381b0 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  fied..  */.  pPg
381c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
381d0 5f 57 52 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20  _WRITEABLE;.  . 
381e0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
381f0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
38200 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
38210 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
38220 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
38230 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
38240 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
38250 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
38260 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
38270 6e 74 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  nt>0 ){.    rc =
38280 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
38290 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 0a  fRequired(pPg);.
382a0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
382b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
382c0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a  ze and return. *
382d0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
382e0 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
382f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
38300 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
38310 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
38320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
38330 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20  is is a variant 
38340 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  of sqlite3PagerW
38350 72 69 74 65 28 29 20 74 68 61 74 20 72 75 6e 73  rite() that runs
38360 20 77 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72   when the sector
38370 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67   size.** is larg
38380 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
38390 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d   size.  SQLite m
383a0 61 6b 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e  akes the (reason
383b0 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e  able) assumption
383c0 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74   that.** all byt
383d0 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61  es of a sector a
383e0 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74  re written toget
383f0 68 65 72 20 62 79 20 68 61 72 64 77 61 72 65 2e  her by hardware.
38400 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74    Hence, all byt
38410 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f  es of.** a secto
38420 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  r need to be jou
38430 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20  rnalled in case 
38440 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  of a power loss 
38450 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
38460 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a  .** a write..**.
38470 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
38480 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c  sector size is l
38490 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
384a0 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69  l to the page si
384b0 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20  ze, in which.** 
384c0 63 61 73 65 20 70 61 67 65 73 20 63 61 6e 20 62  case pages can b
384d0 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77  e individually w
384e0 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f  ritten.  This ro
384f0 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20  utine only runs 
38500 69 6e 20 74 68 65 0a 2a 2a 20 65 78 63 65 70 74  in the.** except
38510 69 6f 6e 61 6c 20 63 61 73 65 20 77 68 65 72 65  ional case where
38520 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
38530 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
38540 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  he sector size..
38550 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
38560 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
38570 67 65 72 57 72 69 74 65 4c 61 72 67 65 53 65 63  gerWriteLargeSec
38580 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tor(PgHdr *pPg){
38590 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
385a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
385b0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
385c0 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f  /.  Pgno nPageCo
385d0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
385e0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
385f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
38600 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
38610 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
38620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38630 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
38640 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
38650 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
38660 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20   int nPage = 0; 
38670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38680 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
38690 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
386a0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
386b0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
386c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
386d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
386e0 0a 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20  .  int needSync 
386f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
38700 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p