/ Hex Artifact Content
Login

Artifact eca40c57a4f35ed9609fa094573077adc99278c1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 69 6e 74  ITE_OMIT_WAL.int
9550: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65   sqlite3PagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  }.# define pager
95a0: 55 73 65 57 61 6c 28 78 29 20 73 71 6c 69 74 65  UseWal(x) sqlite
95b0: 33 50 61 67 65 72 55 73 65 57 61 6c 28 78 29 0a  3PagerUseWal(x).
95c0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
95d0: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
95e0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
95f0: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9600: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
9610: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
9620: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9630: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9640: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9650: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9660: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
9670: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
9680: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
9690: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
96a0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
96b0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
96c0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
96d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
96e0: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
96f0: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9700: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9710: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9720: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9730: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9740: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9750: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9760: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
9770: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
9780: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
9790: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
97a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
97b0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
97c0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
97d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
97e0: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
97f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9800: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9810: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9820: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9830: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9840: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9850: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9860: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9870: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9880: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
9890: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
98a0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
98b0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
98c0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
98d0: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
98e0: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
98f0: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9900: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9910: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9920: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9930: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9940: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9950: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9960: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
9970: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9980: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
9990: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
99a0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
99b0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
99c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
99d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
99e0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
99f0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9a00: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9a10: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9a20: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9a30: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9a40: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9a50: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9a60: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
9a70: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
9a80: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
9a90: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
9aa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9ab0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ac0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9ad0: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9ae0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9af0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9b00: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9b10: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9b20: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9b30: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9b40: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9b50: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9b60: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
9b70: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
9b80: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9b90: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
9ba0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
9bb0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
9bc0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9bd0: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9be0: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9bf0: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9c00: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9c10: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9c20: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9c30: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9c40: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9c50: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9c60: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
9c70: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
9c80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
9c90: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
9ca0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
9cb0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
9cc0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9cd0: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9ce0: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9cf0: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9d00: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9d10: 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
9d20: 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 61  (p->fd) );.    a
9d30: 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63  ssert( p->noSync
9d40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9d50: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9d60: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9d70: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
9d80: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
9d90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9da0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
9db0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9dc0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9dd0: 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74  _ERROR && p->eSt
9de0: 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
9df0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9e00: 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30  agerUseWal(p)==0
9e10: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
9e20: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9e30: 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45 52   is set, a RESER
9e40: 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  VED lock or grea
9e50: 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
9e60: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c  .  ** on the fil
9e70: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9e80: 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  ( pPager->change
9e90: 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20  CountDone==0 || 
9ea0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52  pPager->eLock>=R
9eb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
9ec0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ed0: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
9ee0: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
9ef0: 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
9f00: 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a  case PAGER_OPEN:
9f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
9f20: 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61  MEMDB );.      a
9f30: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
9f40: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
9f50: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9f60: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
9f70: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
9f80: 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20  >pPCache)==0 || 
9f90: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
9fa0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
9fb0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
9fc0: 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61  _READER:.      a
9fd0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
9fe0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
9ff0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a000: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a010: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a020: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a030: 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
a040: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a050: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a060: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a  _WRITER_LOCKED:.
a070: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a080: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a090: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a0a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a0b0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a0c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
a0d0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a0e0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  r) ){.        as
a0f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a100: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a120: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a130: 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  bSize==pPager->d
a140: 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
a150: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a160: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a170: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a180: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a190: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a1a0: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a1b0: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a1c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a1d0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
a1e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a1f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a200: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a  WRITER_CACHEMOD:
a210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a220: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a230: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a240: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a250: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a260: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a270: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a280: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  er) ){.        /
a290: 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
a2a0: 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c   that if journal
a2b0: 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74  _mode=wal here t
a2c0: 68 61 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a  hat neither the.
a2d0: 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
a2e0: 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20  al file nor the 
a2f0: 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65  WAL file are ope
a300: 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  n. This happens 
a310: 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  during.        *
a320: 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61  * a rollback tra
a330: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77  nsaction that sw
a340: 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72  itches from jour
a350: 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20  nal_mode=off.   
a360: 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e       ** to journ
a370: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20  al_mode=wal..   
a380: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a390: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a3a0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a3b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a3c0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a3d0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
a3e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a3f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a400: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a410: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a420: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a430: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a440: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
a450: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a460: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a470: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a480: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a490: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a4a0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a4b0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a4c0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a4d0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a4e0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20  _WRITER_DBMOD:. 
a4f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a520: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a530: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a540: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a550: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a560: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a570: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a580: 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k>=EXCLUSIVE_LOC
a590: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a5a0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a5b0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a5c0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a5d0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a5e0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a5f0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a600: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a610: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a620: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
a630: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a640: 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e  igSize<=pPager->
a650: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a660: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a670: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a680: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20  R_FINISHED:.    
a690: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6a0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a6b0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a6c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a6d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a6e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a6f0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a700: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a710: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a720: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a730: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a740: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a750: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a760: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a770: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a780: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a790: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62        );.      b
a7a0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a7b0: 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20  PAGER_ERROR:.   
a7c0: 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74     /* There must
a7d0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
a7e0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
a7f0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
a800: 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ger if.      ** 
a810: 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  in ERROR state. 
a820: 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61  Otherwise the pa
a830: 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ger should have 
a840: 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a  already dropped.
a850: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
a860: 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20   OPEN state..   
a870: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
a880: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a890: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
a8a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a8b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a8c0: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a8d0: 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50 61 67  Cache)>0 || pPag
a8e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
a8f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a900: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a910: 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
a920: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
a930: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
a940: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a950: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a960: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a970: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a980: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a990: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a9a0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a9b0: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a9c0: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a9d0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a9e0: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a9f0: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
aa00: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
aa10: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
aa20: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
aa30: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
aa40: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
aa50: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aa60: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
aa70: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
aa80: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
aa90: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
aaa0: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
aab0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
aac0: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
aad0: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
aae0: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
aaf0: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
ab00: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
ab10: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
ab20: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
ab30: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
ab40: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
ab50: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
ab60: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
ab70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
ab80: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
ab90: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
aba0: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
abb0: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
abc0: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
abd0: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
abe0: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
abf0: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
ac00: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
ac10: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
ac20: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
ac30: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
ac40: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
ac50: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
ac60: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
ac70: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
ac80: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac90: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
aca0: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
acb0: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
acc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
acd0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
ace0: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
acf0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ad00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
ad10: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
ad20: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
ad30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad40: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
ad50: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
ad60: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
ad70: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ad80: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
ad90: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
ada0: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
adb0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
adc0: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
add0: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
ade0: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
adf0: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
ae00: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
ae10: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
ae20: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
ae30: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ae40: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
ae50: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
ae60: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae70: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
ae80: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
ae90: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
aea0: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
aeb0: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
aec0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
aed0: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
aee0: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
aef0: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
af00: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
af10: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
af20: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
af30: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
af40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
af50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
af60: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
af70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
af90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
afa0: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
afb0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
afc0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
afd0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
afe0: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
aff0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b000: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b010: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
b020: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
b030: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b040: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b050: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
b060: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
b070: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b080: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b090: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
b0a0: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
b0b0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0c0: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
b0d0: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
b0e0: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
b0f0: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
b100: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
b110: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
b120: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
b130: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
b140: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
b150: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
b160: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
b170: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b180: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b190: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b1a0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b1b0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b1c0: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b1d0: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b1e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b1f0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b200: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b210: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b220: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b240: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b250: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b260: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b270: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b280: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b290: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b2a0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b2b0: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b2c0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b2d0: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b2e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b2f0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b300: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b310: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b320: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b330: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b340: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b350: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b360: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b370: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b380: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b390: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b3a0: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b3b0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
b3c0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
b3d0: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
b3e0: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
b3f0: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
b400: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b420: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b430: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
b440: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
b450: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
b460: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b470: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b480: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
b490: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b4a0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b4b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b4c0: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
b4d0: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
b4e0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
b4f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b500: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b510: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b520: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b530: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b540: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b550: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b570: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b580: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b590: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b5a0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b5b0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b5c0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b5d0: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b5e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b5f0: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b600: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b610: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b620: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b630: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b640: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b650: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b660: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b670: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b690: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b6a0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b6b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6c0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b6d0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b6e0: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b6f0: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b700: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b710: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b720: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b730: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b740: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b750: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b760: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b770: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b780: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b790: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b7a0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b7b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b7c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b7d0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b7e0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b7f0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b800: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b810: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b820: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b830: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b840: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b850: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b860: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b870: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b880: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b890: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b8a0: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b8b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b8c0: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b8d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b8e0: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b8f0: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b900: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b910: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b920: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b930: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b940: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b950: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b960: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b970: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b980: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b990: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b9a0: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b9b0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b9c0: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b9d0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b9e0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b9f0: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
ba00: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
ba10: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
ba20: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
ba30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ba40: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
ba50: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
ba60: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
ba70: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
ba80: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
ba90: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
baa0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
bab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bac0: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
bad0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
bae0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
baf0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
bb00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bb10: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
bb20: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
bb30: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
bb40: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
bb50: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
bb60: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
bb70: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bb80: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bb90: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
bba0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
bbb0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
bbc0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
bbd0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bbe0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bbf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bc00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
bc10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bc20: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
bc30: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
bc40: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
bc50: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
bc60: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
bc70: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
bc80: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
bc90: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
bca0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
bcb0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
bcc0: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
bcd0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bce0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
bcf0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bd00: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bd10: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
bd20: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
bd30: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
bd40: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
bd50: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
bd60: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
bd70: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
bd80: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
bd90: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bda0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
bdb0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
bdc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
bdd0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
bde0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
bdf0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
be00: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
be10: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
be20: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
be40: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
be50: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
be60: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
be70: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
be80: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
be90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
bea0: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
beb0: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
bec0: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
bed0: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
bee0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bef0: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
bf00: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
bf10: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
bf20: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
bf30: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bf40: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bf50: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
bf60: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
bf70: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
bf80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bf90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
bfa0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
bfb0: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
bfc0: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
bfd0: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
bfe0: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
bff0: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
c000: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
c010: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
c020: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
c030: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c040: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
c050: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
c060: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
c070: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
c080: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
c090: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
c0a0: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
c0b0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c0c0: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
c0d0: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
c0e0: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
c0f0: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
c100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69  ..**.** The opti
c110: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f  mization is also
c120: 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20   always enabled 
c130: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c140: 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e  les. It is.** an
c150: 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74   error to call t
c160: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
c170: 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64  pPager is opened
c180: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
c190: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  .** database..**
c1a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
c1b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
c1c0: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
c1d0: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
c1e0: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
c1f0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
c200: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
c210: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c220: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
c230: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
c240: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
c250: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
c260: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c270: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
c280: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
c290: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c2a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c2b0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c2c0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
c2d0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
c2e0: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
c310: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
c320: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
c350: 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ze */.    int sz
c360: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
c370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c380: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20  age size */..   
c390: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
c3a0: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
c3b0: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
c3c0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c3d0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c3e0: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
c3f0: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
c400: 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65  Size;.    szPage
c410: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c420: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
c430: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c440: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
c450: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
c460: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c470: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
c480: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
c490: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
c4a0: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
c4b0: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
c4c0: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
c4d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c4e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
c4f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c500: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
c510: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d  PG_SZ(pPager);.}
c520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
c530: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 78  jrnlBufferSize(x
c540: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
c550: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
c560: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
c570: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
c580: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
c590: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
c5a0: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
c5b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
c5c0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
c5d0: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
c5e0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
c5f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
c600: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
c610: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
c620: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c630: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c640: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c650: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c660: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c670: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c680: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c690: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c6a0: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c6b0: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c6c0: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c6d0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c6e0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c6f0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c700: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c710: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c720: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c730: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c740: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c750: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c760: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c770: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c780: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c790: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c7a0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c7b0: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c7c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c7d0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c7e0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c7f0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c800: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c810: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c820: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c830: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c840: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c850: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c860: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c870: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c880: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c890: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c8a0: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c8b0: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c8c0: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c8d0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c8e0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c8f0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c900: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c910: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c920: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c930: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c940: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c950: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c960: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c970: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c980: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c990: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c9a0: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c9b0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c9c0: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c9d0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c9e0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c9f0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
ca00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
ca10: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
ca20: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
ca30: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
ca40: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
ca50: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
ca60: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
ca70: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
ca80: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
ca90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
caa0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
cab0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
cac0: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
cad0: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
cae0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
caf0: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
cb00: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
cb10: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
cb20: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
cb30: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
cb40: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
cb50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cb60: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
cb70: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
cb80: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
cb90: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
cba0: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
cbb0: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
cbc0: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
cbd0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
cbe0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
cbf0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
cc00: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
cc10: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
cc20: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
cc30: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
cc40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
cc50: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
cc60: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
cc70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
cc80: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
cc90: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
cca0: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
ccb0: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
ccc0: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
ccd0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
cce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
ccf0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
cd00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
cd10: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
cd20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
cd30: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
cd40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
cd50: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
cd60: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
cd70: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
cd80: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
cd90: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
cda0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
cdb0: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
cdc0: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
cdd0: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
cde0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
cdf0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
ce00: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
ce10: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
ce20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ce30: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
ce40: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
ce50: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
ce60: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
ce70: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
ce80: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
ce90: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
cea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
ceb0: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
cec0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
ced0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cee0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
cef0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
cf00: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
cf10: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
cf20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
cf50: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
cf80: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
cf90: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cfa0: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
cfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
cfc0: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
cfd0: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
cfe0: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
cff0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
d000: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
d010: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
d020: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
d030: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d050: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
d060: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
d070: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
d080: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
d090: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
d0a0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
d0b0: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
d0c0: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
d0d0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d0e0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d0f0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
d100: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
d110: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d120: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d130: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
d140: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
d150: 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d  ster .   || len=
d160: 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  =0 .   || SQLITE
d170: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d180: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d190: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
d1a0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d1b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d1c0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
d1d0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
d1e0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
d1f0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
d200: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
d210: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d220: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d230: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
d240: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
d250: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d260: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
d270: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
d280: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
d290: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d2a0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
d2b0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
d2c0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
d2d0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
d2e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
d2f0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
d300: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
d310: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
d320: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
d330: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
d340: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
d350: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
d360: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
d370: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
d380: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
d390: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
d3a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
d3b0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
d3c0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
d3d0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
d3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
d3f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
d400: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
d410: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
d420: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d430: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
d440: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
d450: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
d460: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
d470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
d480: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
d490: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
d4a0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
d4b0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
d4c0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
d4d0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
d4e0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
d4f0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
d500: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
d510: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
d520: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d550: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
d5c0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d5d0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
d5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
d5f0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
d600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d610: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
d620: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
d630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
d640: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
d650: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
d660: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d670: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
d680: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d690: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
d6a0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
d6b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d6c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d6d0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
d6e0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
d6f0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
d700: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
d710: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
d720: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d730: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d740: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
d750: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d760: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
d770: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
d780: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
d790: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
d7a0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
d7b0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
d7c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d7d0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
d7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
d7f0: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
d800: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
d810: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
d820: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
d830: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
d840: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
d850: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
d860: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
d870: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
d880: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
d890: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
d8a0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
d8b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d8c0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
d8d0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
d8e0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
d8f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
d900: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
d910: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
d920: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
d930: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
d940: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
d950: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d960: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
d970: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
d980: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
d990: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
d9a0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
d9b0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
d9c0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
d9d0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
d9e0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
d9f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
da00: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
da10: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
da20: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
da30: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
da40: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
da50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
da60: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
da70: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
da80: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
da90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
daa0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
dab0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
dac0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
dad0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
dae0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
daf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
db00: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
db10: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
db20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
db30: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
db40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
db50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
db80: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
db90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dba0: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
dbb0: 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c   !sqlite3Journal
dbc0: 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
dbd0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dbe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dbf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
dc00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
dc10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
dc20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
dc30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
dc40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
dc50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dc60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dc70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dc80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dc90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dca0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dcb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dcc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dcd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dce0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dcf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dd00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dd10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dd20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dd30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dd40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dd60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dd70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dd80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dd90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dda0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
ddb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
ddc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
ddd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dde0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
ddf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
de00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
de10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
de20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
de30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
de40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
de50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
de60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
de70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
de80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
de90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dea0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
deb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
dec0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ded0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dee0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
def0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
df00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
df10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
df20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
df30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
df40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
df50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
df60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
df70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
df80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
df90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dfa0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
dfb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dfc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
dfd0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dfe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dff0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e000: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
e010: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e020: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
e030: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e040: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e050: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e060: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e070: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e080: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e090: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e0a0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e0b0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e0c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e0d0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e0e0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e0f0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e100: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e110: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e120: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e130: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e140: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e150: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e160: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e170: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e180: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e190: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e1a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e1b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e1c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e1d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e1e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e1f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e200: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e210: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e220: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e230: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e240: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e250: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e260: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e270: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e280: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e290: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e2c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e2d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e2e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e2f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e300: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e310: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e320: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e330: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e340: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e350: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e360: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e390: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e3a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e3b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e3e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e3f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e400: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e410: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e420: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e430: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e440: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e450: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e460: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e470: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e480: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e490: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e4a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e4b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e4c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e4d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e4e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e4f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e500: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e510: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e520: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e530: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e540: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e550: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e560: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e570: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e580: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e590: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e5a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e5b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e5c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e5d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e5e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e5f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e600: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e610: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e620: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e630: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e640: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e650: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e660: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e670: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e680: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e690: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e6a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e6b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e6c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e6d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e6e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e6f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e700: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e710: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e720: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e730: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e740: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e750: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e760: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e770: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e780: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e790: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e7a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e7b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e7c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e7d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e7e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e7f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e800: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e810: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e820: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e830: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e840: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e850: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e860: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e870: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e880: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e890: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e8a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e8b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e8c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e8d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e8e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e8f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e900: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e910: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e920: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e930: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e940: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e950: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e960: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e970: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e980: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e990: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e9a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e9b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e9c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e9d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e9e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e9f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
ea00: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
ea10: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
ea20: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
ea30: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
ea40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
ea50: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
ea60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ea70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ea80: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
ea90: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
eaa0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
eab0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
eac0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
ead0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
eae0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
eaf0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
eb00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eb10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
eb20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
eb30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eb40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
eb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
eb60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
eb70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eb80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
eb90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eba0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
ebb0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
ebc0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ebd0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ebe0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ebf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ec00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ec10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ec20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ec30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ec40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
ec50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
ec60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ec70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ec80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
ec90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eca0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ecb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ecc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ecd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ece0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ecf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ed10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ed20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ed30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ed40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ed50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ed60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ed70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ed80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ed90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eda0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
edb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
edc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
edd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ede0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
edf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ee00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ee10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ee20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ee30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ee40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ee50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ee60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ee70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ee80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ee90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eea0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
eeb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
eec0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
eed0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
eee0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
eef0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ef00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ef10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ef20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ef30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ef40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ef50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ef60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ef70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ef80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ef90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
efa0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
efb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
efc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
efd0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
efe0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eff0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
f000: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
f010: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
f020: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
f030: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
f040: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f050: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f060: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f070: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f080: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f090: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f0a0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f0b0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f0c0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f0d0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f0e0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f0f0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f100: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f110: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f120: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f130: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f140: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f150: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f160: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f170: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f180: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f190: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f1a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f1b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f1c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f1d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f1e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f1f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f200: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f210: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f220: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f230: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f240: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f250: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f260: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f270: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f280: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f290: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f2a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f2b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f2c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f2d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f2e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f2f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f300: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f320: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f330: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f340: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f350: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f360: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f370: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f380: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f390: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f3a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f3b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f3c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f3e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f3f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f400: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f410: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f420: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f430: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f440: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f450: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f460: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f470: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f490: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f4a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f4b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f4c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f4d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f4e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f4f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f500: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f510: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f520: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f530: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f540: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f550: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f560: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f570: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f580: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f590: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f5a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f5b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f5c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f5d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f5e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f5f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f600: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f610: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f620: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f630: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f640: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f650: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f660: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f670: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f680: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f690: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f6a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f6b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f6c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f6d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f6e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f6f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f700: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f710: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f720: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f730: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f740: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f750: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f760: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f770: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f780: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f790: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f7b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f7c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f7d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f7e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f7f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f800: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f810: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f820: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f840: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f850: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f860: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f870: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f8a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f8b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f8c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f8d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f8e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f8f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f900: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f910: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f920: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f930: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f940: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f950: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f960: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f970: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f980: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f990: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f9a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f9b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f9c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f9d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f9e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f9f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
fa00: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
fa10: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
fa20: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
fa30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fa40: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
fa50: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
fa60: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fa70: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
fa80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
fa90: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
faa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fab0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
fac0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
fad0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
fae0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
faf0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fb00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fb10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fb20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fb30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fb40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fb50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fb60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fb70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fb80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fb90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
fba0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fbb0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fbc0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fbd0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fbe0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fbf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fc00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fc10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fc20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fc30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fc40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fc50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fc70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fc80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fc90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fca0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fcb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fcc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fcd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fce0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fcf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fd00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fd10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fd20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fd30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fd40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fd50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fd60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fd70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fd80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fd90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fda0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fdb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fdc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fdd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fde0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fdf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fe20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fe30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fe40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fe70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fe80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fe90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fea0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
feb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fec0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fed0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fee0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fef0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
ff00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
ff10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
ff20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
ff30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
ff40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
ff50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
ff60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
ff70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ff80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
ff90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ffa0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ffb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ffc0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
ffd0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
ffe0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fff0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10000 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10010 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
10020 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
10030 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
10040 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
10050 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
10060 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
10070 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10080 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10090 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
100a0 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
100b0 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
100c0 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
100d0 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
100e0 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
100f0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10100 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10110 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10120 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10130 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10140 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10150 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10160 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10170 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10180 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10190 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
101a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
101b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
101c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
101d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
101e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
101f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10200 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10210 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10220 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10230 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10240 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10250 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10260 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10270 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10280 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10290 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
102a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
102b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
102c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
102d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
102e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
102f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10300 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10310 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10320 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10330 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10340 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10350 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10360 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10370 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10380 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10390 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
103a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
103b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
103c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
103d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
103e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
103f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10400 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10410 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10420 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10440 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10450 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10460 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10470 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10480 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10490 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
104a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
104b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
104c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
104d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
104e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
104f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10500 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10510 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10520 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10540 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10550 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10560 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10580 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10590 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
105a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
105b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
105c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
105d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
105e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
105f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10600 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10610 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10620 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10630 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10640 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10650 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10660 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10670 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10680 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10690 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
106a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
106b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
106c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
106d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
106e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
106f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10700 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10710 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10720 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10730 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10740 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10750 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10760 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10770 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10780 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10790 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
107a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
107b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
107c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
107d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
107e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
107f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10800 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10810 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10820 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10830 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10840 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10850 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10860 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10870 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10880 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10890 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
108a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
108b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
108c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
108d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
108e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
108f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10900 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10910 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10920 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10930 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10940 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10960 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10970 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10980 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10990 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
109a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
109b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
109c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
109d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
109e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
109f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10a00 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10a10 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10a20 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10a30 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10a40 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10a50 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10a60 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10a70 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10a80 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10a90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
10aa0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10ab0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10ac0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10ad0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10b00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10b10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10b30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10b40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10b50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10b80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10b90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10ba0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10bc0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10bd0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10be0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10c10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10c30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10c40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10c50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10c60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10c70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10c80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ca0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10cb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10cc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ce0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10cf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10d00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10d10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10d30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10d40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10d50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10d60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10d70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10d80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10d90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10da0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10db0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10dc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10dd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10de0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10df0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10e00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10e10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10e20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10e30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10e40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10e50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10e60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10e70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10e80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10e90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10ea0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10ec0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10ed0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10ee0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10ef0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10f00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10f10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10f20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10f40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10f50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10f60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10f70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10f80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10f90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10fa0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10fb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10fc0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10fd0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10fe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ff0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11000 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
11010 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
11020 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11030 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11040 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11050 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
11060 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
11070 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11080 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11090 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
110a0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
110b0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
110c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
110d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
110e0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
110f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11120 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11140 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11150 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11160 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11170 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11180 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11190 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
111a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
111b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
111c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
111d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
111e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
111f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11200 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11210 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11220 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11230 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11240 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11250 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11260 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11270 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11280 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11290 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
112a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
112b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
112c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
112d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
112e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
112f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11300 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11310 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11320 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11330 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11340 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11350 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11360 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11370 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11380 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11390 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
113a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
113c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
113d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
113e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11400 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11410 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11420 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11430 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11440 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11450 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11460 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11470 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11480 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11490 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
114a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
114b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
114c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
114d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
114e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
114f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11500 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11510 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11520 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11530 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11550 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11560 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11570 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11590 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
115a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
115b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
115c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
115d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
115e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
115f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11600 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11610 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11620 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11630 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11640 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11650 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11660 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11670 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11680 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11690 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
116a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
116b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
116c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
116d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
116e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
116f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11700 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11710 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11720 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11730 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11740 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11750 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11760 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
11770 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  y(pPager->sjfd) 
11780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11790 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
117a0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
117b0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
117c0 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
117d0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
117e0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
117f0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
11800 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
11810 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
11820 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
11830 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
11840 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
11850 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
11860 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
11870 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
11880 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11890 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
118a0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
118b0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
118c0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
118d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
118e0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
118f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
11900 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
11910 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11920 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11930 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11950 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11960 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
11970 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11980 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11990 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
119a0 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
119b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
119c0 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
119d0 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
119e0 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
119f0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
11a00 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
11a10 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
11a20 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
11a30 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
11a40 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11a50 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
11a60 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11a70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11a80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11a90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11aa0 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11ab0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11ac0 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11ad0 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11ae0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11af0 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11b00 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11b10 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11b20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11b30 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11b40 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11b50 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11b60 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11b70 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11b80 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11b90 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11ba0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11bb0 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11bc0 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11bd0 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11be0 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11bf0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11c00 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11c10 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11c20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
11c30 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
11c40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11c50 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
11c60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
11c70 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
11c80 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11c90 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11ca0 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11cb0 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11cc0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11cd0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11ce0 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11cf0 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11d00 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11d10 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11d20 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
11d30 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
11d40 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
11d50 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
11d60 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11d70 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
11d80 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11d90 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11da0 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11db0 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11dc0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11dd0 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11de0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11df0 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11e00 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11e10 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11e20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11e30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11e40 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
11e50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11e60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
11e70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
11e80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11e90 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11ea0 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11eb0 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11ec0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11ed0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11ee0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11ef0 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11f00 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11f10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11f20 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
11f30 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
11f40 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
11f50 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11f60 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
11f70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f90 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11fa0 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11fb0 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11fc0 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11fd0 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11fe0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11ff0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
12000 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
12010 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
12020 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
12030 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
12040 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
12050 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
12060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
12070 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
12080 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
12090 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
120a0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
120b0 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
120c0 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
120d0 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
120e0 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
120f0 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
12100 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12110 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12120 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
12130 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12140 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12150 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
12160 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12170 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12180 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
12190 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
121a0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
121b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
121c0 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
121d0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
121e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
121f0 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
12200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12210 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12220 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
12230 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
12240 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
12250 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
12260 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
12270 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
12280 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
12290 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
122a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
122b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
122c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
122d0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
122e0 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
122f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
12300 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
12310 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
12320 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
12330 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
12340 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
12350 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
12360 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
12370 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
12380 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
12390 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
123a0 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
123b0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
123c0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
123d0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
123e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
123f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
12400 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12410 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
12420 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
12430 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
12440 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
12450 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
12460 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
12470 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
12480 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
12490 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
124a0 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
124b0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
124c0 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
124d0 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
124e0 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
124f0 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
12500 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
12510 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
12520 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
12530 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
12540 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
12550 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
12560 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12570 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12590 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
125a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
125b0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
125c0 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
125d0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
125e0 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
125f0 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
12600 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
12610 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
12620 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
12630 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
12640 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
12650 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
12660 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
12670 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
12680 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
12690 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
126a0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
126b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
126c0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
126d0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
126e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
126f0 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ode ){.    if( p
12700 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
12710 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
12720 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12730 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63  .      pPager->c
12740 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12750 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
12760 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12770 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65  _OPEN;.    }else
12780 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12790 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70 65 6e  eState = (isOpen
127a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20  (pPager->jfd) ? 
127b0 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47  PAGER_OPEN : PAG
127c0 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20 20 20  ER_READER);.    
127d0 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  }.    if( USEFET
127e0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
127f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
12800 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
12810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12820 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
12830 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12850 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12860 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12870 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12880 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12890 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
128a0 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
128b0 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
128c0 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
128d0 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
128e0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
128f0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
12900 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
12910 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
12920 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12930 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12940 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12950 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12960 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12970 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12980 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12990 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
129a0 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
129b0 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
129c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
129d0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
129e0 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
129f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12a00 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
12a10 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
12a20 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12a30 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
12a40 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12a50 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12a60 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12a70 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12a80 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12a90 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12aa0 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
12ab0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12ac0 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
12ad0 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
12ae0 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
12af0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
12b00 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
12b10 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
12b20 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12b30 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
12b40 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b50 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
12b60 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
12b70 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
12b80 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
12b90 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12ba0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12bb0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12bc0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
12bd0 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
12be0 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
12bf0 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
12c00 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
12c10 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
12c20 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12c30 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12c40 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12c50 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12c60 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12c70 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12c80 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12c90 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12ca0 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12cb0 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12cc0 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12ce0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12cf0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12d00 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12d10 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12d20 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12d40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12d50 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12d60 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12d70 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12d80 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12d90 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12da0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12db0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12dc0 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12dd0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12de0 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12e00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12e10 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12e20 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12e30 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ge);../*.** The 
12e40 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
12e50 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72  n open on pPager
12e60 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
12e70 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29  ted (bCommit==1)
12e80 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  .** or rolled ba
12e90 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e  ck (bCommit==0).
12ea0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
12eb0 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  UE if and only i
12ec0 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
12ed0 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73  s should be flus
12ee0 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  hed to disk..**.
12ef0 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ** Rules:.**.** 
12f00 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d    *  For non-TEM
12f10 50 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77  P databases, alw
12f20 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b  ays sync to disk
12f30 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
12f40 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72  sary.**      for
12f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f   transactions to
12f60 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a   be durable..**.
12f70 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d  **   *  Sync TEM
12f80 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20  P database only 
12f90 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74  on a COMMIT (not
12fa0 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65   a ROLLBACK) whe
12fb0 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a  n the backing.**
12fc0 20 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62        file has b
12fd0 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65  een created alre
12fe0 61 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c  ady (via a spill
12ff0 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28   on pagerStress(
13000 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77  )) and.**      w
13010 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
13020 66 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  f dirty pages in
13030 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20   memory exceeds 
13040 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  25% of the total
13050 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73  .**      cache s
13060 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
13070 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43  nt pagerFlushOnC
13080 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
13090 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ger, int bCommit
130a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
130b0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
130c0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
130d0 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e  bCommit ) return
130e0 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65   0;.  if( !isOpe
130f0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  n(pPager->fd) ) 
13100 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
13110 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68  rn (sqlite3PCach
13120 65 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50  ePercentDirty(pP
13130 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d  ager->pPCache)>=
13140 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  25);.}../*.** Th
13150 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
13160 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
13170 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13180 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
13190 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
131a0 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
131b0 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
131c0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
131d0 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
131e0 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
131f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
13200 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
13210 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
13220 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
13230 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
13240 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
13250 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
13260 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
13270 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13280 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13290 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
132a0 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
132b0 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
132c0 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
132d0 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
132e0 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
132f0 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
13300 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
13310 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
13320 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
13330 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
13340 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
13350 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
13360 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
13370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
13380 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
13390 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
133a0 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
133b0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
133c0 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
133d0 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
133e0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
133f0 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
13400 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
13410 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
13420 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
13430 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
13440 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
13450 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
13460 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
13470 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
13480 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
13490 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
134a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
134b0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
134c0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
134d0 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
134e0 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
134f0 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
13500 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
13510 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13520 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13530 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
13540 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
13550 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
13560 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
13570 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
13580 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
13590 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
135a0 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
135b0 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
135c0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
135d0 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
135e0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
135f0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13600 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
13610 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
13620 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13630 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
13640 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
13650 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
13660 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
13670 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
13680 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
13690 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
136a0 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
136b0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
136c0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
136d0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
136e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
136f0 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
13710 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13720 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
13730 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
13740 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
13750 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13770 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
13780 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
13790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
137a0 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
137b0 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
137c0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
137d0 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
137e0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
137f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13800 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
13810 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
13820 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
13830 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
13840 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
13850 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
13860 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
13870 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
13880 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
13890 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
138a0 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
138b0 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
138c0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
138d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
138e0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
138f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13900 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13910 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
13920 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
13930 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13940 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
13950 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
13960 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
13970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13980 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
13990 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
139a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
139b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
139c0 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
139d0 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
139e0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
139f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
13a00 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
13a10 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
13a20 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
13a30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13a40 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
13a50 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
13a60 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13a70 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
13a80 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
13a90 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
13aa0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
13ab0 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
13ac0 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
13ad0 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13ae0 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
13af0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13b00 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
13b10 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
13b20 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
13b30 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
13b40 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13b50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
13b60 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13b70 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
13b80 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
13b90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
13ba0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
13bb0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13bc0 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13bd0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
13be0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
13bf0 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
13c00 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
13c10 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
13c20 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
13c30 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
13c40 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
13c50 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
13c60 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
13c70 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
13c80 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
13c90 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
13ca0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
13cb0 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
13cc0 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13cd0 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
13ce0 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
13cf0 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
13d00 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
13d10 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
13d20 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
13d30 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13d40 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13d50 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13d60 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
13d70 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
13d80 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13d90 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
13da0 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
13db0 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
13dc0 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13dd0 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
13de0 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
13df0 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
13e00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
13e10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13e20 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
13e30 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13e40 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13e50 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13e60 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
13e70 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
13e80 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
13e90 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
13ea0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
13eb0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
13ec0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13ed0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
13ee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
13ef0 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
13f00 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
13f10 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
13f20 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
13f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13f40 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13f50 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13f60 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13f70 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13f80 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13f90 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13fa0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13fb0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13fc0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13fd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
13fe0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
13ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14000 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
14010 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
14020 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
14030 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  fd) ){.      /* 
14040 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14050 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14060 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14070 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20  EMORY ); */.    
14080 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14090 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
140a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
140b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
140c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
140d0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
140e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
140f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
14100 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14130 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
14140 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
14150 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
14160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14170 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c  K && pPager->ful
14180 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
14190 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
141a0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a  the new file siz
141b0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
141c0 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68  o the inode righ
141d0 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20  t away..        
141e0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74    ** Otherwise t
141f0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
14200 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f   resurrect follo
14210 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73  wing a power los
14220 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
14230 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61 73  ** cause the las
14240 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  t transaction to
14250 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65   roll back.  See
14260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74  .          ** ht
14270 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d  tps://bugzilla.m
14280 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f  ozilla.org/show_
14290 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37  bug.cgi?id=10727
142a0 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  73.          */.
142b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
142c0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
142d0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
142e0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
142f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14310 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14320 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
14330 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14340 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14350 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
14360 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
14370 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
14380 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14390 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
143a0 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
143b0 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
143c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
143d0 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70 50  r, hasMaster||pP
143e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
143f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14400 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14420 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
14430 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
14440 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
14450 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
14460 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
14470 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
14480 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
14490 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
144a0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
144b0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
144c0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
144d0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
144e0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
144f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
14500 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
14510 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
14520 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
14530 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
14540 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14550 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70   = !pPager->temp
14560 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65  File;.      asse
14570 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  rt( sqlite3Journ
14580 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14590 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a  ger->jfd)==0 );.
145a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
145b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
145c0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
145d0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
145e0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
145f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14600 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14610 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
14620 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14630 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14640 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
14650 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
14660 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
14670 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
14680 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74        if( bDelet
14690 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
146a0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
146b0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
146c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
146d0 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  , pPager->extraS
146e0 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
146f0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
14700 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
14710 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ES.  sqlite3Pcac
14720 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
14730 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14740 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
14750 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  sh);.  if( pPage
14760 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20  r->dbSize==0 && 
14770 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
14780 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
14790 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
147a0 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74  PgHdr *p = sqlit
147b0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
147c0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
147d0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
147e0 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
147f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14800 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b  UnrefNotNull(p);
14810 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14820 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
14830 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
14840 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
14850 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
14860 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
14870 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
14880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14890 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   ){.    if( MEMD
148a0 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68 4f  B || pagerFlushO
148b0 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c 20  nCommit(pPager, 
148c0 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  bCommit) ){.    
148d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
148e0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
148f0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 65  pPCache);.    }e
14900 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
14910 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69  e3PcacheClearWri
14920 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50  table(pPager->pP
14930 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Cache);.    }.  
14940 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
14950 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
14960 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
14970 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
14980 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
14990 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
149a0 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
149b0 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
149c0 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
149d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
149e0 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
149f0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14a00 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14a10 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
14a20 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
14a30 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
14a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14a50 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
14a60 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
14a70 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14a80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14a90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14aa0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14ab0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14ac0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14ad0 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14ae0 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14af0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14b00 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14b10 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
14b20 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
14b30 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
14b40 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
14b50 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
14b60 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
14b70 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14b80 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14b90 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14ba0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14bb0 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14bc0 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14bd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14be0 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14bf0 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14c00 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14c10 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
14c20 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
14c30 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
14c40 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
14c50 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
14c60 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
14c70 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14c80 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14c90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14ca0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14cb0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14cc0 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14cd0 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14ce0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d00 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14d10 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
14d20 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
14d30 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
14d40 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
14d50 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
14d60 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
14d70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14d80 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14d90 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14da0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14db0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14dc0 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14dd0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14de0 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14df0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14e00 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14e10 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
14e20 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
14e30 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
14e40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
14e50 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
14e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
14e70 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14e80 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14e90 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14ea0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14eb0 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14ed0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14ee0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14ef0 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14f00 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14f10 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
14f20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14f30 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
14f40 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14f50 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
14f60 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
14f70 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14f80 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14f90 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14fa0 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
14fb0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14fc0 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
14fd0 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
14fe0 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
14ff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15000 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
15010 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
15020 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
15030 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
15040 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
15050 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
15060 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
15070 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
15080 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
15090 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
150a0 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
150b0 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
150c0 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
150d0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
150e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
150f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
15100 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
15110 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
15120 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
15130 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15140 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
15150 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
15160 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
15170 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
15180 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
15190 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
151a0 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
151b0 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
151c0 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
151d0 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
151e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
151f0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15200 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
15210 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15220 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15230 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
15240 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
15250 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
15260 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
15270 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
15280 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15290 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
152a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
152b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
152c0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
152d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
152e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
152f0 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
15300 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15310 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
15320 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
15330 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
15340 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15350 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15360 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
15370 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
15380 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
15390 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
153a0 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
153b0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
153c0 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
153d0 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
153e0 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
153f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
15400 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
15410 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
15420 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
15430 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
15440 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
15450 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
15460 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
15470 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
15480 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
15490 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
154a0 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
154b0 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
154c0 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
154d0 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
154e0 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
154f0 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
15500 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
15510 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
15520 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
15530 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
15540 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
15550 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
15560 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
15570 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15580 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15590 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
155a0 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
155b0 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
155c0 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
155d0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
155e0 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
155f0 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15600 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15610 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
15620 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
15630 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
15640 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
15650 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
15660 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
15670 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15680 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15690 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
156a0 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
156b0 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
156c0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
156d0 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
156e0 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
156f0 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15700 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15710 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
15720 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
15730 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
15740 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
15750 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
15760 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
15770 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15780 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15790 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
157a0 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
157b0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
157c0 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
157d0 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
157e0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
157f0 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15800 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15810 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15820 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
15830 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
15840 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
15850 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
15860 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
15870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
15880 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
15890 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
158a0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
158b0 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
158c0 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
158d0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
158e0 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
158f0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15900 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15910 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
15920 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
15930 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
15940 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
15950 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
15960 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
15990 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
159a0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
159b0 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
159c0 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
159d0 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
159e0 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
159f0 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
15a00 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15a10 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
15a20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
15a30 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
15a40 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
15a50 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
15a60 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
15a70 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
15a80 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
15a90 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
15aa0 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
15ab0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15ac0 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
15ad0 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
15ae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15af0 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
15b00 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
15b10 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
15b20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
15b30 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
15b40 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
15b50 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
15b60 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
15b70 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
15b80 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
15b90 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
15ba0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
15bb0 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
15bc0 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
15bd0 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
15be0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
15bf0 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
15c00 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
15c10 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
15c20 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
15c30 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
15c40 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
15c50 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
15c60 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
15c70 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
15c80 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
15c90 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15ca0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15cb0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
15cc0 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
15cd0 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
15ce0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15cf0 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
15d00 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15d10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
15d20 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
15d30 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15d40 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
15d50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
15d60 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
15d70 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
15d80 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
15d90 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
15da0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15db0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
15dc0 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
15dd0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
15de0 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
15df0 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
15e00 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
15e10 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
15e20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
15e30 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15e40 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
15e50 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
15e60 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
15e70 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
15e80 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
15e90 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15ea0 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
15eb0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15ec0 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
15ed0 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
15ee0 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
15ef0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
15f00 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
15f10 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15f20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15f30 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
15f40 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
15f50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15f60 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
15f70 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
15f80 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
15f90 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
15fa0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15fb0 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
15fc0 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
15fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
15fe0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15ff0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
16000 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
16010 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
16020 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16030 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
16040 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
16050 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
16060 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
16070 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
16080 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
16090 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
160a0 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
160b0 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
160c0 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
160d0 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
160e0 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
160f0 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
16100 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
16110 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
16120 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16130 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
16140 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
16150 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
16160 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
16170 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
16180 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
16190 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
161a0 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
161b0 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
161c0 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
161d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
161e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
161f0 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
16200 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
16210 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
16220 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
16230 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
16240 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
16250 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
16260 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
16270 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
16280 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16290 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
162a0 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
162b0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
162c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
162d0 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
162e0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
162f0 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
16300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16310 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
16320 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
16330 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16350 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
16360 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
16370 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
16380 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
163a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
163b0 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
163c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
163d0 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
163e0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
163f0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16400 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
16410 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
16420 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16430 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
16440 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
16450 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
16460 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
16470 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16480 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
16490 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
164a0 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
164d0 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
164e0 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
164f0 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
16500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16510 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
16520 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
16530 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16540 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
16550 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
16560 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
16570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16580 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
165b0 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
165c0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
165d0 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
165e0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
165f0 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
16600 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16610 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
16620 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
16630 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
16640 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
16650 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
16660 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
16670 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
16680 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
16690 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
166a0 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
166b0 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
166c0 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
166d0 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
166e0 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
166f0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
16700 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
16710 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
16720 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
16730 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
16740 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
16750 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
16760 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
16770 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
16780 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
16790 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
167a0 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
167b0 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
167c0 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
167d0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
167e0 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
167f0 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
16800 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
16810 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
16820 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
16830 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
16840 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
16850 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16860 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
16870 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
16880 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
16890 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
168a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
168b0 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
168c0 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
168d0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
168e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
168f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16900 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16910 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16920 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
16930 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16940 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
16950 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
16960 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
16970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16980 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16990 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
169a0 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
169b0 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
169c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
169d0 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
169e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
169f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
16a00 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
16a10 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
16a20 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
16a30 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
16a40 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
16a50 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
16a60 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
16a70 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
16a80 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
16a90 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
16aa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16ab0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16ac0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16ad0 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
16ae0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16af0 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
16b00 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
16b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16b20 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
16b30 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
16b40 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
16b50 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
16b60 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
16b70 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
16b80 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
16b90 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
16ba0 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
16bb0 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
16bc0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16bd0 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
16be0 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
16bf0 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
16c00 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
16c10 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
16c20 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
16c30 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
16c40 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
16c50 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
16c60 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
16c70 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
16c80 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
16c90 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
16ca0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
16cb0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
16cc0 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
16cd0 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
16ce0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16cf0 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
16d00 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
16d10 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
16d20 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
16d30 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
16d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16d50 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
16d60 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
16d70 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
16d80 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
16d90 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
16da0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16db0 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
16dc0 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
16dd0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
16de0 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
16df0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16e00 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
16e10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
16e20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
16e30 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
16e40 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  k before during 
16e50 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
16e60 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16e70 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16e80 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16e90 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16ea0 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16eb0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
16ec0 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
16ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16ee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16ef0 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
16f00 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
16f10 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
16f20 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
16f30 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
16f40 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
16f50 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
16f60 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
16f70 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16f80 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16f90 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16fa0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
16fb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
16fc0 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
16fd0 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
16fe0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
16ff0 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
17000 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
17010 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
17020 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
17030 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
17040 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
17050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
17060 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
17070 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
17080 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
17090 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
170a0 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
170b0 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
170c0 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
170d0 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
170e0 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
170f0 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
17100 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
17110 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
17120 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
17130 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
17140 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
17150 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
17160 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
17170 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
17180 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
17190 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
171a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
171b0 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
171c0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
171d0 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
171e0 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
171f0 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
17200 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
17210 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
17220 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
17230 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
17240 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
17250 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
17260 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
17270 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
17280 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
17290 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
172a0 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
172b0 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
172c0 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
172d0 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
172e0 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
172f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
17300 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
17310 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
17320 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
17330 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
17340 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
17350 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
17360 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
17370 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
17380 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
17390 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
173a0 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
173b0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
173c0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
173d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
173e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
173f0 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
17400 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
17410 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
17420 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
17430 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
17440 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
17450 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
17460 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
17470 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
17480 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
17490 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
174a0 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
174b0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
174c0 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
174d0 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
174e0 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
174f0 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
17500 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
17510 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
17520 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
17530 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
17540 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
17550 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
17560 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
17570 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
17580 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
17590 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
175a0 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
175b0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
175c0 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
175d0 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
175e0 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
175f0 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
17600 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17610 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
17620 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
17630 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
17640 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
17650 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
17660 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
17670 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
17680 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
17690 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
176a0 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
176b0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
176c0 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
176d0 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
176e0 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
176f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
17700 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
17710 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
17720 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
17730 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
17740 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
17750 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
17760 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
17770 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17780 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
17790 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
177a0 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
177b0 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
177c0 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
177d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
177e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
177f0 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
17800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
17810 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
17820 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
17830 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
17840 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
17850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
17860 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
17870 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
17880 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
17890 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52  pFile );.  PAGER
178a0 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
178b0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
178c0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
178d0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
178e0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
178f0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
17900 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
17910 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
17920 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
17930 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
17940 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
17950 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
17960 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
17970 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
17980 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
17990 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
179a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
179b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
179c0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
179d0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
179e0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
179f0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
17a00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
17a10 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
17a20 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17a30 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
17a40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
17a50 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
17a60 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
17a70 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
17a80 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
17a90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
17ab0 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
17ac0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
17ad0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
17ae0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
17af0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17b00 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17b10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
17b20 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
17b30 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
17b40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17b50 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
17b60 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
17b70 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
17b80 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
17b90 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
17ba0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17bb0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
17bc0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
17bd0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
17be0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
17bf0 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 73 71  _BKPT);.      sq
17c00 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
17c10 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
17c20 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44  p, pgno, (u8*)aD
17c30 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  ata);.      CODE
17c40 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
17c50 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
17c60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
17c70 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
17c80 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
17c90 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
17ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17cb0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
17cc0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17cd0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
17ce0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
17cf0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
17d00 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
17d10 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
17d20 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
17d30 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
17d40 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
17d50 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
17d60 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
17d70 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
17d80 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
17d90 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17da0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
17db0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
17dc0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
17dd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17de0 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
17df0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
17e00 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
17e10 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
17e20 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
17e30 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
17e40 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
17e50 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
17e60 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
17e70 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
17e80 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17e90 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17ea0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17eb0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
17ec0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
17ed0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
17ee0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
17ef0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
17f00 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
17f10 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
17f20 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
17f30 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
17f40 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
17f50 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
17f60 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17f70 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
17f80 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
17f90 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
17fa0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
17fb0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
17fc0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
17fd0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17fe0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
17ff0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
18000 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18010 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
18020 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
18030 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
18040 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18050 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30  LAG_ROLLBACK)==0
18060 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18070 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
18080 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18090 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
180a0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
180b0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
180c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
180d0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
180e0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
180f0 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20  OLLBACK)!=0 );. 
18100 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
18110 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
18120 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
18130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18140 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18150 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18160 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
18170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
18180 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
18190 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
181a0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
181b0 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
181c0 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
181d0 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
181e0 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
181f0 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
18200 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
18210 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
18220 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
18230 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
18240 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
18250 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
18260 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
18270 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
18280 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
18290 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
182a0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
182b0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
182c0 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
182d0 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
182e0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
182f0 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
18300 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
18310 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18320 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
18330 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
18340 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  /* It used to be
18350 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61   that sqlite3Pca
18360 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
18370 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72  ) was called her
18380 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74  e.  But.    ** t
18390 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e  hat call was dan
183a0 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e  gerous and had n
183b0 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e  o detectable ben
183c0 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63  efit since the c
183d0 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  ache.    ** is n
183e0 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20  ormally cleaned 
183f0 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
18400 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72  CleanAll() after
18410 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f   rollback and so
18420 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
18430 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20   removed. */.   
18440 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
18450 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
18460 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
18470 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
18480 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
18490 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
184a0 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
184b0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
184c0 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
184d0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
184e0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
184f0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
18500 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
18510 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
18520 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
18530 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
18540 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
18550 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
18560 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
18570 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18580 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
18590 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
185a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
185b0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
185c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
185d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
185e0 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
185f0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18600 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18610 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
18620 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
18630 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
18640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18650 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
18660 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18670 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18680 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18690 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
186a0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
186b0 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
186c0 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
186d0 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
186e0 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
186f0 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18700 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
18710 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
18720 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
18730 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
18740 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
18750 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
18760 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18770 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18780 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18790 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
187a0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
187b0 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
187c0 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
187d0 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
187e0 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
187f0 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18800 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
18810 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
18820 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
18830 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
18840 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
18850 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18860 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18870 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18890 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
188a0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
188b0 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
188c0 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
188d0 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
188e0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
188f0 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18900 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18910 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18920 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18930 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18940 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18950 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18970 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18980 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18990 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
189a0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
189b0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
189c0 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
189d0 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
189e0 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
189f0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18a00 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18a10 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18a20 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18a30 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18a40 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18a50 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18a60 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18a70 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18a80 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18a90 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18aa0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18ab0 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18ac0 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18ad0 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18ae0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18af0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18b00 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18b10 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18b20 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18b30 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18b40 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18b50 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18b60 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18b70 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18b80 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18b90 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18ba0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18bb0 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18bc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18bd0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18be0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18bf0 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18c00 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18c10 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
18c20 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
18c30 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18c40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18c50 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18c60 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18c70 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18c80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18c90 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18ca0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18cb0 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18cc0 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18cd0 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18ce0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18cf0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18d00 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18d10 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18d20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18d30 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18d40 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18d50 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18d60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18d70 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18d90 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18da0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18db0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18dc0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18df0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18e00 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18e10 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18e20 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18e30 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18e40 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18e50 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18e60 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
18e70 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18e80 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
18e90 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
18ea0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
18eb0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
18ec0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
18ed0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
18ee0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18ef0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18f00 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18f10 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
18f20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18f30 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
18f40 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
18f50 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
18f60 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
18f70 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
18f80 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
18f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18fa0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
18fb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18fc0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
18fd0 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
18fe0 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
18ff0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19000 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
19010 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
19020 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
19030 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
19040 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
19050 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19060 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19070 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19080 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19090 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
190a0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
190b0 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
190c0 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
190d0 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
190e0 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
190f0 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19100 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
19110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19120 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
19130 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
19140 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
19150 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
19160 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19170 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
19180 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19190 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
191a0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
191b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
191c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
191d0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
191e0 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
191f0 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
19200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
19210 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
19220 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
19230 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
19240 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
19250 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
19260 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
19270 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
19280 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
19290 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
192a0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
192b0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
192c0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
192d0 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
192e0 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
192f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19300 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
19310 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
19320 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
19330 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
19340 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19350 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
19360 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
19370 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
19380 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
19390 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
193a0 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
193b0 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
193c0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
193d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
193e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  MEM_BKPT;.    go
193f0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19400 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
19410 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
19420 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
19430 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
19440 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
19450 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
19460 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
19470 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
19480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19490 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
194a0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
194b0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
194c0 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
194d0 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
194e0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
194f0 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
19500 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
19510 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
19520 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
19530 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19540 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
19550 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
19560 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
19570 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
19580 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19590 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
195a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
195b0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
195c0 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
195d0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
195e0 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
195f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19600 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
19610 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
19620 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
19630 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
19640 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
19650 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
19660 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
19670 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
19680 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
19690 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
196a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
196b0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
196c0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
196d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
196e0 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
196f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
19700 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
19710 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
19720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19740 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19750 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19760 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
19770 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
19780 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
19790 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
197a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
197b0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
197c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
197d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
197e0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
197f0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19800 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
19810 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
19820 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
19830 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
19840 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
19850 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
19860 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
19870 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
19880 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19890 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
198a0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
198b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
198c0 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
198d0 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
198e0 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
198f0 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
19900 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19920 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
19930 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
19940 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
19950 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
19960 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
19970 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
19980 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19990 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
199a0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
199b0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
199c0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
199d0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
199e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
199f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19a00 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
19a10 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
19a20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
19a30 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
19a40 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
19a50 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
19a60 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
19a70 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
19a80 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
19a90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
19aa0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
19ab0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
19ac0 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
19ad0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
19ae0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
19af0 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20  n, or the pager 
19b00 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72  is not in either
19b10 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45  .** DBMOD or OPE
19b20 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  N state, this fu
19b30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
19b40 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
19b50 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68  e size .** of th
19b60 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65  e file is change
19b70 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
19b80 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
19b90 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
19ba0 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65   .** If the file
19bb0 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
19bc0 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
19bd0 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
19be0 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
19bf0 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
19c00 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
19c10 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
19c20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
19c30 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
19c40 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
19c50 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
19c60 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
19c70 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
19c80 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
19c90 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
19ca0 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
19cb0 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
19cc0 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
19cd0 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
19ce0 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
19cf0 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
19d00 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
19d10 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
19d20 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
19d30 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
19d40 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
19d50 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
19d60 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
19d70 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
19d80 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
19d90 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
19da0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19db0 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
19dc0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
19dd0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
19de0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19df0 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
19e00 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
19e10 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
19e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
19e30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19e40 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
19e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19e60 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19e70 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
19e80 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
19e90 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
19ea0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
19eb0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
19ec0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
19ed0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
19ee0 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
19ef0 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
19f00 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
19f10 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
19f20 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
19f30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19f40 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
19f50 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
19f60 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
19f70 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
19f80 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
19f90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19fa0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
19fb0 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
19fc0 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
19fd0 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
19fe0 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
19ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a000 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
1a010 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
1a020 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
1a030 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a050 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
1a060 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
1a070 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1a080 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61  currentSize+szPa
1a090 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ge)<=newSize ){.
1a0a0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54          char *pT
1a0b0 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  mp = pPager->pTm
1a0c0 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
1a0d0 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20  memset(pTmp, 0, 
1a0e0 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  szPage);.       
1a0f0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1a100 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
1a110 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1a120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a130 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1a140 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
1a150 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a160 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1a170 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
1a180 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
1a190 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
1a1a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1a1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a1c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1a1d0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
1a1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a1f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a200 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a210 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73  a sanitized vers
1a220 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ion of the secto
1a230 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c  r-size of OS fil
1a240 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  e pFile. The.** 
1a250 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a260 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69  guaranteed to li
1a270 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64  e between 32 and
1a280 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a2a0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1a2b0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1a2c0 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71  .  int iRet = sq
1a2d0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1a2e0 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
1a2f0 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69  iRet<32 ){.    i
1a300 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  Ret = 512;.  }el
1a310 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f  se if( iRet>MAX_
1a320 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
1a330 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
1a340 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
1a350 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41  );.    iRet = MA
1a360 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
1a370 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
1a380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1a390 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1a3a0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1a3b0 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
1a3c0 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
1a3d0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
1a3e0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a3f0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
1a400 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
1a410 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1a420 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
1a430 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
1a440 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
1a450 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
1a460 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
1a470 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
1a480 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1a490 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
1a4a0 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
1a4b0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1a4c0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
1a4d0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
1a4e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a4f0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1a500 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
1a510 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
1a520 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
1a530 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a540 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
1a550 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a560 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a570 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
1a580 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
1a590 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
1a5a0 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
1a5b0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
1a5c0 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
1a5d0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
1a5e0 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
1a5f0 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
1a600 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
1a610 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1a620 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
1a630 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
1a640 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
1a650 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
1a660 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
1a670 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
1a680 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
1a690 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a6a0 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
1a6b0 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
1a6c0 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
1a6d0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1a6e0 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1a6f0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1a700 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1a710 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1a720 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1a730 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1a740 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1a750 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1a760 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1a770 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1a780 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1a790 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1a7a0 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1a7b0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1a7c0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1a7d0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1a7e0 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1a7f0 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1a800 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a810 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1a820 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1a830 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1a840 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a850 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1a860 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1a870 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1a880 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1a890 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1a8a0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1a8b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a8c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1a8d0 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1a8e0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a8f0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a900 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1a910 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1a920 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1a930 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1a940 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1a950 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1a960 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1a970 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1a980 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1a990 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1a9a0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1a9b0 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1a9c0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1a9d0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1a9e0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a9f0 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1aa00 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1aa10 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1aa20 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1aa30 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1aa40 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1aa50 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1aa60 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1aa70 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1aa80 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1aa90 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1aaa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1aab0 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1aac0 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1aad0 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1aae0 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1aaf0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1ab00 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1ab10 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1ab20 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1ab30 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1ab40 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1ab50 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1ab60 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1ab70 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1ab80 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1ab90 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1aba0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1abb0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1abc0 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1abd0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1abe0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1abf0 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1ac00 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1ac10 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1ac20 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1ac30 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1ac40 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1ac50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1ac60 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1ac70 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1ac80 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1ac90 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1aca0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1acb0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1acc0 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1acd0 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1ace0 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1acf0 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1ad00 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1ad10 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1ad20 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1ad30 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1ad40 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1ad50 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1ad60 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1ad70 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1ad80 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1ad90 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1ada0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1adb0 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1adc0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1add0 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1ade0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1adf0 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1ae00 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1ae10 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1ae20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1ae30 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1ae40 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1ae50 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1ae60 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1ae70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1ae80 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1ae90 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1aea0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1aeb0 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1aec0 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1aed0 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1aee0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1aef0 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1af00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1af10 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1af20 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1af30 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1af40 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1af50 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1af60 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1af70 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1af80 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1af90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1afa0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1afb0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1afc0 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1afd0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1afe0 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1aff0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1b000 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1b010 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1b020 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1b030 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1b040 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1b050 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1b060 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1b070 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1b080 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1b090 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1b0a0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1b0b0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1b0c0 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1b0d0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1b0e0 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1b0f0 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1b100 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1b110 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1b120 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1b130 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1b140 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1b150 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1b160 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1b170 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1b180 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1b190 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1b1a0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1b1b0 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1b1c0 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1b1d0 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1b1e0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1b1f0 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1b200 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1b210 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1b220 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1b230 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1b240 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1b250 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b260 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1b270 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1b280 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1b290 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1b2a0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1b2b0 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1b2c0 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1b2d0 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1b2e0 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1b2f0 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1b300 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1b310 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1b320 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1b330 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1b340 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1b350 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1b360 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1b370 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1b380 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1b390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1b3a0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1b3b0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1b3c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b3d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1b3e0 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1b3f0 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1b400 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1b410 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1b420 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1b430 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1b440 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1b450 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1b460 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1b470 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1b480 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1b490 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1b4a0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1b4b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1b4c0 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1b4d0 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1b4e0 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1b4f0 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1b500 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1b510 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1b520 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1b530 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1b540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b550 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1b560 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1b570 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1b580 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1b590 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1b5a0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1b5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b5c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b5d0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1b5e0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b600 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1b610 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b620 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b640 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1b650 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1b660 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1b670 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b680 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1b690 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1b6a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b6c0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1b6d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b6e0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1b6f0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1b700 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1b710 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1b720 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1b730 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1b740 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1b750 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1b760 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1b770 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1b780 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1b790 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1b7a0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1b7b0 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79  k */.  int nPlay
1b7c0 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  back = 0;       
1b7d0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1b7e0 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65  of pages restore
1b7f0 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
1b800 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1b810 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1b820 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1b830 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1b840 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1b850 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1b860 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1b870 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1b880 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1b890 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1b8a0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1b8b0 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1b8c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b8d0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b8e0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1b8f0 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1b900 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1b910 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1b920 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1b930 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1b940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1b950 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1b960 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1b970 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1b980 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1b990 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1b9a0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1b9b0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1b9c0 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1b9d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b9e0 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1b9f0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1ba00 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1ba10 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1ba20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1ba30 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1ba40 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1ba50 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1ba60 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1ba70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1ba80 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1ba90 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1baa0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1bab0 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69   ** mxPathname i
1bac0 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1bad0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1bae0 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1baf0 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1bb00 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1bb10 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1bb20 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1bb30 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1bb40 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bb50 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1bb60 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bb70 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1bb80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bb90 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1bba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bbb0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1bbc0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1bbd0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1bbe0 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1bbf0 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1bc00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1bc10 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1bc20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bc30 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1bc40 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1bc50 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1bc60 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1bc70 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1bc80 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1bc90 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1bca0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1bcb0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1bcc0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1bcd0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1bce0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1bcf0 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1bd00 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bd10 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1bd20 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bd30 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bd40 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bd50 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bd60 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bd70 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bd80 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bd90 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bda0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bdb0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bdc0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bdd0 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bde0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bdf0 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1be00 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1be10 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1be20 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1be30 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1be40 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1be50 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1be60 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1be70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1be80 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1be90 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1bea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1beb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1bec0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bed0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1bee0 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1bef0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bf00 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1bf10 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1bf20 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1bf30 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1bf40 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1bf50 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1bf60 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1bf70 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1bf80 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1bf90 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1bfa0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1bfb0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1bfc0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1bfd0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1bfe0 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1bff0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1c000 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1c010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c030 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1c040 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1c050 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1c060 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1c070 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1c080 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c090 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c0a0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c0b0 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1c0c0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1c0d0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1c0e0 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1c0f0 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1c100 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1c110 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1c120 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1c130 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1c140 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1c150 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1c160 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c170 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c180 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c190 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c1a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c1b0 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c1c0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c1d0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c1e0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c1f0 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c200 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c210 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c220 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c230 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c240 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c250 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c260 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c270 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c280 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c290 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c2a0 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c2b0 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c2c0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c2d0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c2e0 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c2f0 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c300 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c310 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c320 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c330 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c340 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c350 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c360 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c370 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c390 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c3a0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c3b0 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c3c0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c3d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c3e0 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c3f0 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c400 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c410 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c420 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c430 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c440 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c450 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c460 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c470 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c480 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c490 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c4a0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c4b0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c4c0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c4d0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c4e0 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c4f0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c500 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c510 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c520 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c530 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c540 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c550 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c560 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c580 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c590 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c5b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c5c0 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c5d0 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c5e0 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c5f0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c600 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c610 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c620 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c630 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c640 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c650 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c660 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c670 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c680 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c690 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c6a0 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c6b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c6c0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c6d0 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c6e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c6f0 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c710 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c720 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c770 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c790 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c7a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c7b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c7c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c7d0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c7e0 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c7f0 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c800 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c810 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c820 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c830 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c840 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c850 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c860 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1c870 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1c880 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1c890 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1c8a0 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1c8b0 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1c8c0 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1c8d0 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1c8e0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1c8f0 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1c900 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1c910 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1c920 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1c930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c940 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c950 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c970 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1c980 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1c990 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1c9a0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1c9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1c9c0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1c9d0 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1c9e0 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1c9f0 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1ca00 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1ca10 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1ca20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1ca30 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1ca40 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1ca50 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1ca60 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1ca70 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1ca80 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1ca90 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1caa0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1cad0 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1cae0 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1caf0 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1cb00 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1cb10 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1cb20 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1cb30 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1cb40 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1cb50 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1cb60 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1cb70 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1cb80 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1cb90 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1cba0 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1cbb0 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1cbc0 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1cbd0 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1cbe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1cbf0 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1cc00 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1cc10 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1cc20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1cc30 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1cc40 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1cc50 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1cc60 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1cc70 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1cc80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1cc90 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1cca0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1ccb0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1ccc0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1ccd0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1cce0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1ccf0 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1cd00 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cd10 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1cd20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cd30 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1cd40 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cd50 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cd60 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cd70 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cd80 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cd90 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cda0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cdb0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cdc0 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cdd0 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cde0 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cdf0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1ce00 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1ce10 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1ce20 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1ce30 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1ce40 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1ce50 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1ce60 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1ce70 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1ce80 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1ce90 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1cea0 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1ceb0 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1cec0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1ced0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1cee0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1cef0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1cf00 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1cf10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cf20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1cf30 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1cf40 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1cf50 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1cf60 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1cf70 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1cf80 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1cf90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cfb0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cfc0 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1cfd0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1cfe0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1cff0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1d000 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1d010 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d020 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1d030 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1d040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d050 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d060 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1d070 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1d080 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1d090 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d0a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d0b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d0c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1d0d0 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1d0e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d0f0 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1d100 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1d110 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1d120 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1d130 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1d140 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1d150 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1d160 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d170 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d180 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d190 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d1a0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d1b0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d1c0 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d1d0 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d1e0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d1f0 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d200 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d210 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d220 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d230 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d240 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d250 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d260 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d270 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d280 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d290 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d2a0 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d2b0 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d2c0 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d2d0 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d2e0 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d2f0 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d300 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d310 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d320 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d330 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d350 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d360 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d370 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d390 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d3a0 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d3b0 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d3c0 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d3d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d3e0 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d3f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d400 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d410 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d420 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d430 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d440 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d450 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d460 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d470 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d480 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d490 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d4a0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d4b0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d4c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d4d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d4e0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d4f0 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d500 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d510 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d520 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d530 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d540 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d550 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d560 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d570 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d580 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d590 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d5a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d5b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d5c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d5d0 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d5e0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d5f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d600 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d610 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d620 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d630 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d640 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d650 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d660 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d670 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d680 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d690 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d6a0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d6b0 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d6c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d6d0 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d6e0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d6f0 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d700 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d710 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d720 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d730 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d740 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d750 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d760 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d770 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d780 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d7a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d7b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d7c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d7d0 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d7e0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d7f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d800 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d810 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d820 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d830 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d840 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d850 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d860 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1d870 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1d880 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1d890 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1d8a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1d8b0 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1d8c0 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1d8d0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1d8e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1d8f0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1d900 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1d910 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1d920 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1d930 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1d940 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1d950 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1d960 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1d970 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1d980 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1d990 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1d9a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d9b0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1d9c0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1d9d0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1d9e0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1d9f0 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1da00 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1da10 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1da20 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1da30 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1da40 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1da50 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1da60 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1da70 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1da80 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1da90 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1daa0 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1dab0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1dac0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1dad0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1dae0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1daf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1db00 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1db10 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1db20 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1db30 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1db40 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1db50 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1db60 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1db70 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1db80 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1db90 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1dba0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1dbb0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1dbc0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1dbd0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1dbe0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1dbf0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1dc00 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1dc10 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1dc20 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1dc30 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1dc40 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1dc50 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1dc60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dc70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1dc80 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1dc90 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1dca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dcb0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1dcc0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1dcd0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1dce0 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1dcf0 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1dd00 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1dd10 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1dd20 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1dd30 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1dd40 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1dd50 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1dd60 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1dd70 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1dd80 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1dd90 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1dda0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ddb0 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1ddc0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1ddd0 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1dde0 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1ddf0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1de00 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1de10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1de20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1de30 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1de40 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1de50 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1de60 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1de70 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1de80 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1de90 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1dea0 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1deb0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1dec0 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1ded0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1dee0 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1def0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1df00 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1df10 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1df20 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1df30 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1df40 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1df50 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1df60 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1df70 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1df80 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1df90 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1dfa0 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1dfb0 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1dfc0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1dfd0 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1dfe0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1dff0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e000 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1e010 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1e020 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1e030 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e040 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1e050 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1e060 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1e070 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1e080 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1e090 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e0a0 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1e0b0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1e0c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e0d0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1e0e0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1e0f0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1e100 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1e110 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1e120 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1e130 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1e140 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1e150 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1e160 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1e170 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1e180 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e190 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1e1a0 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1e1b0 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1e1c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1e1d0 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1e1e0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e1f0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e200 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e210 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e220 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e230 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e250 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e260 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e270 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e280 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e290 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e2a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e2b0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e2c0 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e2d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e2e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e2f0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e300 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e310 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e320 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e330 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e350 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e360 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e370 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e380 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e390 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e3a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e3b0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e3c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e3d0 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e3e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e3f0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e400 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e410 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e440 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e450 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e480 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e490 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e4b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e4c0 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e4d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e4e0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e4f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e500 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e510 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e520 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e530 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e540 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e550 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e560 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e570 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e580 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e590 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e5a0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e5b0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e5c0 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e5d0 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e5e0 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e5f0 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e600 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e610 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e620 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e630 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e640 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1e650 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1e660 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1e670 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1e680 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1e690 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1e6a0 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1e6b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1e6c0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1e6d0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1e6e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e6f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e700 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e710 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1e720 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1e730 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1e740 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1e750 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1e760 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e770 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e790 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1e7a0 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e7c0 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1e7d0 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1e7e0 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1e7f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e800 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1e810 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1e820 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1e830 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1e840 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1e850 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1e860 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1e870 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1e880 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1e890 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1e8a0 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1e8b0 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1e8c0 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1e8d0 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1e8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1e8f0 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1e900 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1e910 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1e920 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1e930 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1e940 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1e950 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1e960 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1e970 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1e980 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1e990 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1e9a0 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1e9b0 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1e9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1e9d0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1e9e0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1e9f0 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1ea00 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1ea10 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1ea20 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1ea30 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1ea40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ea50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ea60 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1ea70 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1ea80 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1ea90 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1eaa0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1eab0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1eac0 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1ead0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1eae0 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1eaf0 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1eb00 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1eb10 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1eb20 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1eb30 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1eb40 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1eb50 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1eb60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1eb70 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1eb80 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1eb90 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1eba0 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1ebb0 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1ebc0 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1ebd0 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1ebe0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ebf0 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1ec00 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1ec30 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1ec60 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1ec70 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1eca0 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1ecb0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1ecc0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1ecd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ece0 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1ecf0 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1ed00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ed20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1ed30 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1ed60 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20  es in pList */. 
1ed70 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1eda0 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20  over pages */.. 
1edb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1edc0 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1edd0 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1ede0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1edf0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1ee00 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1ee10 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1ee20 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1ee30 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1ee40 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1ee50 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1ee60 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1ee70 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1ee80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1ee90 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1eea0 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1eeb0 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1eec0 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1eed0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1eee0 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1eef0 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1ef00 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1ef10 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1ef20 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1ef30 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1ef40 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1ef50 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1ef60 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1ef70 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1ef80 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1ef90 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1efa0 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1efb0 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1efc0 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  /.    PgHdr **pp
1efd0 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1efe0 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1eff0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1f000 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1f010 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f020 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1f030 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1f040 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1f050 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1f060 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1f070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1f080 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1f090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1f0a0 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1f0b0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1f0c0 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1f0d0 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1f0e0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1f0f0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1f100 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1f110 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f120 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1f130 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1f140 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1f150 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1f160 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
1f170 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
1f180 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1f190 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1f1a0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1f1b0 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f1c0 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f1d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f1e0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1f1f0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1f200 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1f210 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1f220 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f230 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1f240 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f250 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f260 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f270 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f280 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f290 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1f2a0 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1f2b0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1f2c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1f2d0 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1f2e0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1f2f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f300 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1f310 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1f320 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1f330 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1f340 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1f350 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1f360 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1f370 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1f380 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1f390 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1f3a0 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1f3b0 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1f3c0 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1f3d0 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1f3e0 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1f3f0 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1f400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f410 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1f420 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1f430 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f440 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f460 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f470 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f490 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1f4a0 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1f4b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1f4c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1f4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f4e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f4f0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1f500 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f510 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1f520 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f530 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1f540 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1f550 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1f560 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f570 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f580 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1f590 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1f5a0 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1f5b0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1f5c0 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1f5d0 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1f5e0 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1f5f0 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1f600 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1f610 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1f620 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f630 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1f640 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f650 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1f660 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f670 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1f680 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1f690 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1f6a0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1f6b0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1f6c0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
1f6d0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
1f6e0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
1f6f0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
1f700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f710 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1f720 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f730 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1f740 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1f750 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1f760 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1f770 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1f780 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1f790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f7a0 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1f7b0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1f7c0 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1f7d0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1f7e0 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1f7f0 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1f800 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1f810 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f820 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f830 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1f840 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1f850 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1f860 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1f870 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1f880 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f890 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1f8a0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1f8b0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1f8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f8d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1f8e0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1f8f0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1f900 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f920 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1f930 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1f940 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1f950 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1f960 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1f970 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1f980 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1f990 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1f9a0 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1f9b0 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1f9c0 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1f9d0 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1f9e0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1f9f0 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1fa00 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1fa10 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1fa20 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1fa30 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1fa40 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1fa50 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1fa60 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1fa70 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1fa80 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1fa90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1faa0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1fab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fac0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1fad0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1fae0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1faf0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
1fb00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
1fb10 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e  mpFile==0 );.  n
1fb20 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1fb30 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1fb40 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1fb50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1fb60 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1fb70 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
1fb80 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
1fb90 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
1fba0 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
1fbb0 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73   page counte bas
1fbc0 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
1fbd0 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1fbe0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1fbf0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1fc00 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1fc10 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
1fc20 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
1fc30 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
1fc40 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
1fc50 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
1fc60 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  age==0 && ALWAYS
1fc70 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  (isOpen(pPager->
1fc80 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20  fd)) ){.    i64 
1fc90 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1fca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fcb0 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1fcc0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
1fcd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1fce0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1fcf0 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  fd, &n);.    if(
1fd00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fd10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1fd20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
1fd30 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
1fd40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
1fd50 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
1fd60 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
1fd70 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1fd80 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1fd90 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
1fda0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1fdb0 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1fdc0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1fdd0 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1fde0 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1fdf0 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1fe00 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1fe10 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1fe20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1fe30 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1fe40 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1fe50 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1fe60 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1fe70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fe80 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1fe90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1fea0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1feb0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1fec0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1fed0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1fee0 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1fef0 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1ff00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1ff10 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1ff20 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1ff30 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1ff40 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1ff50 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1ff60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1ff70 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1ff80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ff90 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1ffa0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1ffb0 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1ffc0 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1ffd0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1ffe0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1fff0 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
20000 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
20010 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
20020 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
20030 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
20040 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
20050 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20060 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
20070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20080 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
20090 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
200a0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
200b0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
200c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
200d0 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
200e0 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
200f0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
20100 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
20110 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
20120 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
20130 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
20140 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
20150 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
20160 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
20170 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
20180 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
20190 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
201a0 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
201b0 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
201c0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
201d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
201e0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
201f0 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
20200 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
20210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
20220 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20230 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20240 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
20250 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
20260 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
20270 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
20280 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
20290 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
202a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
202b0 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
202c0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
202d0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
202e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
202f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20300 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
20310 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
20320 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
20330 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
20340 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20350 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
20360 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20370 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
20380 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
20390 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
203a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
203b0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
203c0 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ENT ) rc = SQLIT
203d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61  E_OK;.      isWa
203e0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
203f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20400 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
20410 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20420 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
20430 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
20440 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
20450 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
20460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
20480 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
20490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
204a0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
204b0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
204c0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
204d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
204e0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
204f0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
20500 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
20510 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
20520 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20530 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WAL ){.        p
20540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20550 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
20560 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20  ALMODE_DELETE;. 
20570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20590 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c  #endif../*.** Pl
205a0 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  ayback savepoint
205b0 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c   pSavepoint. Or,
205c0 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d   if pSavepoint==
205d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62  NULL, then playb
205e0 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  ack.** the entir
205f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
20600 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20   file. The case 
20610 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
20620 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a   occurs when .**
20630 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63   a ROLLBACK TO c
20640 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65  ommand is invoke
20650 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54  d on a SAVEPOINT
20660 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73   that is a trans
20670 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70  action .** savep
20680 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oint..**.** When
20690 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e   pSavepoint is n
206a0 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67  ot NULL (meaning
206b0 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69   a non-transacti
206c0 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
206d0 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  .** being rolled
206e0 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65   back), then the
206f0 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   rollback consis
20700 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65  ts of up to thre
20710 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72  e stages,.** per
20720 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72  formed in the or
20730 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a  der specified:.*
20740 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20750 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  re played back f
20760 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
20770 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20780 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66   byte.**     off
20790 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  set PagerSavepoi
207a0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
207b0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a  ontinuing to .**
207c0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
207d0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20  int.iHdrOffset, 
207e0 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
207f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20800 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66  l.**     file if
20810 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20820 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65  iHdrOffset is ze
20830 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ro..**.**   * If
20840 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20850 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f  iHdrOffset is no
20860 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67  t zero, then pag
20870 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a  es are played.**
20880 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69       back starti
20890 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
208a0 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64  nal header immed
208b0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
208c0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
208d0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
208e0 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  et to the end of
208f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20900 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  l file..**.**   
20910 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e  * Pages are then
20920 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20930 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
20940 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67  l file, starting
20950 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65  .**     with the
20960 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20970 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74  iSubRec and cont
20980 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e  inuing to the en
20990 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20  d of.**     the 
209a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
209b0 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74  .** Throughout t
209c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63  he rollback proc
209d0 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61  ess, each time a
209e0 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20   page is rolled 
209f0 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72  back, the.** cor
20a00 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
20a10 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65  s set in a bitve
20a20 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72  c structure (var
20a30 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74  iable pDone in t
20a40 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
20a50 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69  tion below). Thi
20a60 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73  s is used to ens
20a70 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20  ure that a page 
20a80 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65  is only.** rolle
20a90 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74  d back the first
20aa0 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
20ab0 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65  untered in eithe
20ac0 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  r journal..**.**
20ad0 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69   If pSavepoint i
20ae0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67  s NULL, then pag
20af0 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79  es are only play
20b00 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20b10 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
20b20 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20   file. There is 
20b30 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  no need for a bi
20b40 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73  tvec in this cas
20b50 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  e..**.** In eith
20b60 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20  er case, before 
20b70 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63  playback commenc
20b80 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53  es the Pager.dbS
20b90 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
20ba0 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20  is reset to the 
20bb0 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65  value that it he
20bc0 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ld at the start 
20bd0 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
20be0 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63   .** (or transac
20bf0 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77  tion). No page w
20c00 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65  ith a page-numbe
20c10 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
20c20 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  his value.** is 
20c30 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20  played back. If 
20c40 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  one is encounter
20c50 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20  ed it is simply 
20c60 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
20c70 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79  ic int pagerPlay
20c80 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61  backSavepoint(Pa
20c90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67  ger *pPager, Pag
20ca0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
20cb0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20  vepoint){.  i64 
20cc0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
20cd0 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76       /* Effectiv
20ce0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
20cf0 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
20d00 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
20d10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
20d20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74  of first segment
20d30 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c   of main-journal
20d40 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   records */.  in
20d50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20d60 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
20d70 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65   code */.  Bitve
20d80 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20  c *pDone = 0;   
20d90 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f      /* Bitvec to
20da0 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c   ensure pages pl
20db0 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f  ayed back only o
20dc0 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  nce */..  assert
20dd0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20de0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
20df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20e00 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
20e10 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
20e20 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
20e30 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
20e40 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
20e50 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
20e60 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
20e70 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
20e80 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
20e90 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
20ea0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
20eb0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
20ec0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20ed0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
20ee0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
20ef0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
20f00 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
20f10 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
20f20 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
20f30 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
20f40 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
20f50 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
20f60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
20f70 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
20f80 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
20f90 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
20fa0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
20fb0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20fc0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
20fd0 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76  le;..  if( !pSav
20fe0 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55  epoint && pagerU
20ff0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21000 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
21010 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61  rRollbackWal(pPa
21020 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
21030 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
21040 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
21050 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
21060 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
21070 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
21080 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
21090 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
210a0 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
210b0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
210c0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
210d0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
210e0 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
210f0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
21100 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
21110 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
21120 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
21130 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
21140 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61  >journalOff;.  a
21150 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
21160 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
21170 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a   szJ==0 );..  /*
21180 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
21190 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
211a0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
211b0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
211c0 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
211d0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
211e0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
211f0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
21200 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
21210 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
21220 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
21230 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
21240 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
21250 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
21260 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
21270 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
21280 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
21290 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
212a0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
212b0 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
212c0 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
212d0 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
212e0 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
212f0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
21300 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67  avepoint && !pag
21310 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21320 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
21330 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
21340 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
21350 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
21360 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
21370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21380 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
21390 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
213a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
213b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
213c0 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
213d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
213e0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
213f0 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
21400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
21410 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
21420 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21430 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21440 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
21450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21460 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
21470 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
21480 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
21490 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
214a0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
214b0 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
214c0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
214d0 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
214e0 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
214f0 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
21500 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
21510 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
21520 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
21530 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
21540 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
21550 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
21560 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
21570 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
21580 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
21590 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
215a0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
215b0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
215c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
215d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
215e0 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
215f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
21600 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
21610 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
21620 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
21630 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
21640 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
21650 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
21660 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21670 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
21680 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
21690 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
216a0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
216b0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
216c0 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
216d0 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
216e0 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
216f0 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
21700 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
21710 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
21720 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
21730 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
21740 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
21750 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
21760 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
21770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
21780 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
21790 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
217a0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
217b0 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
217c0 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
217d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
217e0 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
217f0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
21800 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
21810 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
21820 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
21830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21840 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
21850 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21860 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21870 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
21880 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
21890 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
218a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
218b0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
218c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
218d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
218e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73  r->journalOff>=s
218f0 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
21900 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
21910 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
21920 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
21930 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
21940 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
21950 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
21960 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
21970 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
21980 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
21990 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
219a0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
219b0 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
219c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
219d0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
219e0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
219f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21a00 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
21a10 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61  ffset = (i64)pSa
21a20 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21a30 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21a40 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
21a50 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21a60 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
21a70 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
21a80 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
21a90 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
21aa0 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
21ab0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
21ac0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21ad0 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
21ae0 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
21af0 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
21b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
21b10 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28  ffset==(i64)ii*(
21b20 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21b30 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
21b40 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
21b50 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
21b60 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
21b70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
21b80 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
21b90 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
21ba0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
21bb0 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
21bc0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
21be0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21bf0 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
21c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21c10 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
21c20 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
21c30 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
21c40 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a  hat are allowed.
21c50 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ** before attemp
21c60 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20  ting to recycle 
21c70 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64  clean and unused
21c80 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   pages..*/.void 
21c90 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
21ca0 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
21cb0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
21cc0 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
21cd0 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
21ce0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21cf0 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
21d00 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21d10 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21d20 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21d30 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
21d40 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65  d.** before atte
21d50 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20  mpting to spill 
21d60 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c  pages to journal
21d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21d80 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
21d90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
21da0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
21db0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
21dc0 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65  acheSetSpillsize
21dd0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21de0 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
21df0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54  .** Invoke SQLIT
21e00 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
21e10 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  E based on the c
21e20 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
21e30 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69  szMmap..*/.stati
21e40 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d  c void pagerFixM
21e50 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  aplimit(Pager *p
21e60 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49  Pager){.#if SQLI
21e70 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
21e80 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  >0.  sqlite3_fil
21e90 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e  e *fd = pPager->
21ea0 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  fd;.  if( isOpen
21eb0 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74  (fd) && fd->pMet
21ec0 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
21ed0 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
21ee0 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73  _int64 sz;.    s
21ef0 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  z = pPager->szMm
21f00 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ap;.    pPager->
21f10 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e  bUseFetch = (sz>
21f20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
21f30 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
21f40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
21f50 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
21f60 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
21f70 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
21f80 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21f90 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
21fa0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
21fb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21fc0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
21fd0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
21fe0 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
21ff0 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
22000 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
22010 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
22020 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
22030 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
22040 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
22050 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
22060 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
22070 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
22080 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22090 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
220a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
220b0 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
220c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
220d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
220e0 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
220f0 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
22100 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
22110 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
22120 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
22130 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
22140 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
22150 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
22160 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
22170 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
22180 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
22190 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
221a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
221b0 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
221c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
221d0 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
221e0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
221f0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
22200 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
22210 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
22220 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
22230 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22240 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
22250 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22260 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22270 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
22280 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
22290 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
222a0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
222b0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
222c0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
222d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
222e0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
222f0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22300 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
22310 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
22320 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
22330 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22340 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22350 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
22360 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22370 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
22380 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
22390 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
223a0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
223b0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
223c0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
223d0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
223e0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
223f0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
22400 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
22410 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
22420 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22430 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22440 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22450 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22460 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22470 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
22480 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22490 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
224a0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
224b0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
224c0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
224d0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
224e0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
22500 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
22510 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
22520 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
22530 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22540 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22550 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22560 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22570 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
22580 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22590 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
225a0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
225b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
225c0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
225d0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
225e0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
225f0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
22600 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
22610 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
22620 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
22630 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
22640 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
22650 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
22660 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
22670 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
22680 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
22690 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
226a0 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
226b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
226c0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
226d0 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
226e0 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
226f0 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
22700 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
22710 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
22720 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
22730 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
22740 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
22750 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
22760 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
22770 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22780 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
22790 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
227a0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
227b0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
227c0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
227d0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
227e0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
227f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
22800 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
22810 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
22820 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
22830 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
22840 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
22850 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
22860 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
22870 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
22880 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
22890 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
228a0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
228b0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
228c0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
228d0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
228e0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
228f0 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
22900 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
22910 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
22920 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
22930 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
22940 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
22950 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
22960 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
22970 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
22980 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
22990 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
229a0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
229b0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
229c0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
229d0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
229e0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
229f0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
22a00 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
22a10 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22a20 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
22a30 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
22a40 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
22a50 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
22a60 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
22a70 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
22a80 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
22a90 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
22aa0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
22ab0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
22ac0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
22ad0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
22ae0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
22af0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
22b00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22b10 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
22b20 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
22b30 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
22b40 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
22b50 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
22b60 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
22b70 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
22b80 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
22b90 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
22ba0 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
22bb0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
22bc0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
22bd0 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
22be0 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
22bf0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
22c00 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
22c10 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22c20 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
22c30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
22c40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
22c50 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
22c60 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
22c70 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
22c80 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
22c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
22ca0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
22cb0 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
22cc0 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
22cd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
22ce0 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
22cf0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22d00 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
22d10 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
22d20 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
22d30 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
22d40 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
22d50 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
22d60 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22d70 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
22d80 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22d90 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
22da0 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22db0 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
22dc0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22dd0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22de0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22df0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22e00 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22e10 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22e20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22e30 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
22e40 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22e50 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22e60 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22e70 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
22e80 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22e90 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22ea0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
22eb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22ec0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ed0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22ee0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22ef0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22f00 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
22f10 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
22f20 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
22f30 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
22f40 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
22f50 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22f60 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
22f70 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
22f80 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
22f90 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22fa0 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
22fb0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
22fc0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
22fd0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
22fe0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
22ff0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
23000 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23010 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
23020 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23030 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
23040 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
23050 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
23060 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
23070 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
23080 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
23090 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
230a0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
230b0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
230c0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
230d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
230e0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
230f0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
23100 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
23110 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23120 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
23130 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
23140 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
23150 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23160 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
23170 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
23180 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
23190 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
231a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
231b0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
231c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
231d0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
231e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
231f0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
23200 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
23210 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
23220 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
23230 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
23240 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
23250 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
23260 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23270 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
23280 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
23290 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
232a0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
232b0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
232c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
232d0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
232e0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
232f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23300 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23310 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23320 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
23330 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
23340 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23350 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
23360 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
23370 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
23380 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
23390 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
233a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
233b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
233c0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
233d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
233e0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
233f0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
23400 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
23410 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
23420 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
23430 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
23440 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
23450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
23460 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
23470 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23480 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
23490 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
234a0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
234b0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
234c0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
234d0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
234e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
234f0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
23500 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
23510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23520 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
23530 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
23540 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
23550 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
23560 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
23570 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
23580 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
23590 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
235a0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
235b0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
235c0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
235d0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
235e0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
235f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
23600 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
23610 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23620 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23630 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
23640 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
23650 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
23660 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
23670 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
23680 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
23690 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
236a0 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
236b0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
236c0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
236d0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
23700 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
23710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23740 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
23750 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
23760 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
23770 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
23780 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
23790 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
237a0 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
237b0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
237c0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
237d0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
237e0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
237f0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
23800 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
23810 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23820 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23830 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23840 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23850 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
23860 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
23870 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
23880 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
23890 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
238a0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
238b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
238c0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
238d0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
238e0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
238f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23900 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
23910 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23920 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23930 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23940 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23950 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
23960 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
23970 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23980 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
23990 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
239a0 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
239b0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
239c0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
239d0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
239e0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
239f0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
23a00 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
23a10 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23a20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23a30 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23a40 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23a50 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
23a60 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
23a70 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
23a80 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
23a90 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23aa0 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23ab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23ac0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23ad0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
23ae0 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
23af0 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
23b00 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
23b10 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23b20 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23b30 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23b40 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23b50 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
23b60 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
23b70 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
23b80 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
23b90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23ba0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
23bb0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
23bc0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
23bd0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
23be0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
23bf0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
23c00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
23c10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
23c20 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
23c30 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
23c40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23c50 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
23c60 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
23c70 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
23c80 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
23c90 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
23ca0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
23cb0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
23cc0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
23cd0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
23ce0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
23cf0 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
23d00 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
23d10 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23d20 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
23d30 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
23d40 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
23d50 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
23d60 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
23d70 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
23d80 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23d90 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
23da0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
23db0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
23dc0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
23dd0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
23de0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
23df0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
23e00 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
23e10 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
23e20 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
23e30 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
23e40 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
23e50 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
23e60 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
23e70 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
23e80 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
23e90 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
23ea0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
23eb0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23ec0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23ed0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
23ee0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
23ef0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23f00 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23f10 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
23f20 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
23f30 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
23f40 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
23f50 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
23f60 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
23f70 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23f80 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
23f90 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
23fa0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
23fb0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
23fc0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
23fd0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
23fe0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
23ff0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
24000 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
24010 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
24020 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24040 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
24050 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
24060 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
24070 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
24080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24090 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
240a0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
240b0 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
240c0 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
240d0 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
240e0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
240f0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
24100 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
24110 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
24120 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
24130 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
24140 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
24150 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
24160 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
24170 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
24180 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
24190 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
241a0 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
241b0 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
241c0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
241d0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
241e0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
241f0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
24200 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
24210 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
24220 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
24230 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
24240 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
24250 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
24260 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
24270 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
24280 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
24290 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
242a0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
242b0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
242c0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
242d0 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
242e0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
242f0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
24300 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24310 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
24320 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
24330 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
24340 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
24350 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
24360 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
24370 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
24380 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
24390 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
243a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
243b0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
243c0 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
243d0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
243e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
243f0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
24400 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
24410 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24430 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
24440 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
24450 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
24460 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
24470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24480 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  EM_BKPT;.    }..
24490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
244a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
244b0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
244c0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
244d0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
244e0 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
244f0 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
24500 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
24510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24520 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24530 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
24540 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
24550 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
24560 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
24570 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
24580 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
24590 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
245a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
245b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
245c0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
245d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
245e0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
245f0 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
24600 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
24610 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
24620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24630 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
24640 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
24650 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
24660 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
24670 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
24680 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
24690 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
246a0 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
246b0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
246c0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
246d0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
246e0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
246f0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
24700 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24710 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24720 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
24730 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
24740 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
24750 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
24760 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
24770 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
24780 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
24790 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
247a0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
247b0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
247c0 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
247d0 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
247e0 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
247f0 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
24800 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
24810 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
24820 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
24830 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
24840 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
24850 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
24860 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
24870 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
24880 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
24890 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
248a0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
248b0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
248c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
248d0 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
248e0 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
248f0 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
24900 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
24910 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
24920 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
24930 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
24940 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
24950 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
24960 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
24970 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
24980 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
24990 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
249a0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
249b0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
249c0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
249d0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
249e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
249f0 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
24a00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
24a10 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
24a20 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
24a30 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
24a40 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
24a50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24a60 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
24a70 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
24a80 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
24a90 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
24aa0 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
24ab0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
24ac0 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
24ad0 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
24ae0 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
24af0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
24b00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
24b10 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
24b20 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
24b30 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
24b40 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
24b50 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
24b60 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
24b70 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
24b80 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
24b90 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
24ba0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
24bb0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
24bc0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
24bd0 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
24be0 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
24bf0 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
24c00 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
24c10 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
24c20 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
24c30 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
24c40 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24c50 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
24c60 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
24c70 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
24c80 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
24c90 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
24ca0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24cb0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
24cc0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
24cd0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24ce0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
24cf0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
24d00 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
24d10 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24d20 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
24d30 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24d40 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
24d50 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
24d60 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
24d70 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24d80 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
24d90 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
24da0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
24db0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
24dc0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
24dd0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
24de0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
24df0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
24e00 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
24e10 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
24e20 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
24e30 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
24e40 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
24e50 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
24e60 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
24e70 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
24e80 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
24e90 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
24ea0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
24eb0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
24ec0 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
24ed0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
24ee0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
24ef0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
24f00 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
24f10 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
24f20 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
24f30 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
24f40 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
24f50 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
24f60 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
24f70 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
24f80 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
24f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
24fa0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
24fb0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
24fc0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
24fd0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
24fe0 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
24ff0 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
25000 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
25010 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
25020 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
25030 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
25040 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
25050 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
25060 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
25070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
25080 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
25090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
250a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
250b0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
250c0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
250d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
250e0 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
250f0 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
25100 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
25110 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
25120 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
25130 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
25140 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
25150 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
25160 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
25170 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
25180 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
25190 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
251a0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
251b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
251c0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
251d0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
251e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
251f0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
25200 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
25210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
25220 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
25230 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
25240 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25250 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25260 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25270 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
25280 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
25290 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
252a0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
252b0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
252c0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
252d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
252e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
252f0 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
25300 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
25310 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
25320 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
25330 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
25340 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
25350 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
25360 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
25370 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25380 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25390 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
253a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
253b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
253c0 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
253d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
253e0 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
253f0 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
25400 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
25410 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
25420 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
25430 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
25440 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
25450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25460 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
25470 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
25480 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
25490 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
254a0 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
254b0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
254c0 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
254d0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
254e0 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
254f0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
25500 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
25510 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
25520 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
25530 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
25540 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
25550 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
25560 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
25570 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
25580 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
25590 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
255a0 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
255b0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
255c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
255d0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
255e0 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
255f0 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
25600 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
25610 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
25620 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
25630 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
25640 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
25650 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
25660 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
25670 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
25680 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
25690 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
256a0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
256b0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
256c0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
256f0 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
25700 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
25710 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
25720 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
25730 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
25740 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
25750 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
25760 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
25770 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
25780 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
25790 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
257a0 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
257b0 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
257c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
257d0 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
257e0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
257f0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
25800 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
25810 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25820 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
25830 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
25840 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
25850 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
25860 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
25870 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
25880 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
25890 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
258a0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
258b0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
258c0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
258d0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
258e0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
258f0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
25900 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
25910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25920 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
25930 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25940 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
25950 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
25960 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
25970 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
25980 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
25990 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
259a0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
259b0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
259c0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
259d0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
259e0 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
259f0 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
25a00 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
25a10 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
25a20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
25a30 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
25a40 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
25a50 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
25a60 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
25a70 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
25a80 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
25a90 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
25aa0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
25ab0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
25ac0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
25ad0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
25ae0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25af0 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
25b00 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
25b10 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
25b20 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
25b30 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
25b40 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
25b50 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
25b60 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
25b70 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
25b80 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
25b90 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
25ba0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
25bb0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
25bc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25bd0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
25be0 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
25bf0 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
25c00 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
25c10 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
25c20 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
25c30 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
25c40 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
25c50 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
25c60 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
25c70 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
25c80 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
25c90 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
25ca0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
25cb0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
25cc0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
25cd0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
25ce0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
25cf0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
25d00 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
25d10 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
25d20 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
25d30 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
25d40 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
25d50 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
25d60 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
25d70 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
25d80 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
25d90 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
25da0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
25db0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25dc0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
25dd0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
25de0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25df0 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
25e00 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
25e10 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
25e20 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
25e30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
25e40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
25e50 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25e60 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
25e70 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
25e80 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
25e90 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
25ea0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
25eb0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
25ec0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
25ed0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
25ee0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
25ef0 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
25f00 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
25f10 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
25f20 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
25f30 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
25f40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
25f50 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
25f60 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
25f70 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
25f80 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
25f90 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
25fa0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
25fb0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
25fc0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
25fd0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
25fe0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
25ff0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
26000 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
26010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26020 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
26030 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
26040 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
26050 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
26060 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
26070 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
26080 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
26090 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
260a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
260b0 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
260c0 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
260d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
260e0 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
260f0 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
26100 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
26110 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
26120 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
26130 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
26140 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
26150 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
26160 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
26170 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26180 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
26190 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
261a0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
261b0 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
261c0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
261d0 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
261e0 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
261f0 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
26200 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
26210 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
26220 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
26230 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
26240 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
26250 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
26260 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
26270 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
26280 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
26290 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
262a0 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
262b0 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
262c0 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
262d0 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
262e0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
262f0 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
26300 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
26310 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
26320 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
26330 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
26340 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
26350 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
26360 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
26370 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
26380 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
26390 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
263a0 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
263b0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
263c0 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
263d0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
263e0 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
263f0 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
26400 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
26410 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26420 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
26430 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
26440 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
26450 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
26460 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26470 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
26480 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
26490 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
264a0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
264b0 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
264c0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
264d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
264e0 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
264f0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
26500 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
26510 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
26520 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
26530 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
26540 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
26550 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
26560 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
26570 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
26580 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26590 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
265a0 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
265b0 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
265c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
265d0 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
265e0 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
265f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
26600 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
26610 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
26620 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
26630 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
26640 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
26650 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
26660 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
26670 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26680 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
26690 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
266a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
266b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
266c0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
266d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
266e0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
266f0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
26700 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
26710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26720 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26730 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
26740 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
26750 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
26760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ;.}../*.** Obtai
26780 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
26790 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
267a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
267b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
267c0 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
267d0 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
267e0 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
267f0 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
26800 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
26810 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
26820 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
26830 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
26840 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
26850 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
26860 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
26870 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
26880 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
26890 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
268a0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
268b0 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
268c0 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
268d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
268e0 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
268f0 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
26900 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26910 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
26920 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
26930 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
26940 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
26950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26960 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
26970 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26990 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
269a0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
269b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
269c0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
269d0 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
269e0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
269f0 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
26a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26a10 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
26a20 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
26a30 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
26a60 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
26a70 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67  */.  .  if( pPag
26a80 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26a90 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
26aa0 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
26ab0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26ac0 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
26ad0 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
26ae0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
26af0 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  ty = 0;.    mems
26b00 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c  et(p->pExtra, 0,
26b10 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
26b20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
26b30 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67  ppPage = p = (Pg
26b40 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  Hdr *)sqlite3Mal
26b50 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
26b60 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e  gHdr) + pPager->
26b70 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28  nExtra);.    if(
26b80 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
26b90 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
26ba0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
26bb0 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
26bc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
26bd0 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
26be0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
26bf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
26c00 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69  p->pExtra = (voi
26c10 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  d *)&p[1];.    p
26c20 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f  ->flags = PGHDR_
26c30 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  MMAP;.    p->nRe
26c40 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50  f = 1;.    p->pP
26c50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
26c60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
26c70 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a  >pExtra==(void *
26c80 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65  )&p[1] );.  asse
26c90 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20  rt( p->pPage==0 
26ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26cb0 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41  flags==PGHDR_MMA
26cc0 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  P );.  assert( p
26cd0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
26ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26cf0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70  >nRef==1 );..  p
26d00 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
26d10 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74   p->pData = pDat
26d20 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  a;.  pPager->nMm
26d30 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75  apOut++;..  retu
26d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26d50 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
26d60 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
26d70 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74  ge pPg. pPg must
26d80 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72   have been retur
26d90 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61  ned by an .** ea
26da0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61  rlier call to pa
26db0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
26dc0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
26dd0 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65  oid pagerRelease
26de0 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70  MapPage(PgHdr *p
26df0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
26e00 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
26e10 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  er;.  pPager->nM
26e20 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d  mapOut--;.  pPg-
26e30 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
26e40 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
26e50 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  .  pPager->pMmap
26e60 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a  Freelist = pPg;.
26e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26e80 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  r->fd->pMethods-
26e90 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a  >iVersion>=3 );.
26ea0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
26eb0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
26ec0 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
26ed0 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
26ee0 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  ze, pPg->pData);
26ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
26f00 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ll PgHdr objects
26f10 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
26f20 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69  ager.pMmapFreeli
26f30 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  st list..*/.stat
26f40 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65  ic void pagerFre
26f50 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a  eMapHdrs(Pager *
26f60 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
26f70 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e   *p;.  PgHdr *pN
26f80 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  ext;.  for(p=pPa
26f90 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26fa0 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  st; p; p=pNext){
26fb0 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
26fc0 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69  pDirty;.    sqli
26fd0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
26fe0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  .}.../*.** Shutd
26ff0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
27000 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
27010 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
27020 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
27030 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
27040 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
27050 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
27060 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
27070 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
27080 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
27090 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
270a0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
270b0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
270c0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
270d0 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
270e0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
270f0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
27100 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
27110 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
27120 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
27130 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
27140 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
27150 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
27160 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
27170 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
27180 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
27190 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
271a0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
271b0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
271c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
271d0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
271e0 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
271f0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
27200 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
27210 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
27220 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
27230 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
27240 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
27250 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
27260 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a  Pager, sqlite3 *
27270 64 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  db){.  u8 *pTmp 
27280 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
27290 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
272a0 73 65 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65  sert( db || page
272b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
272c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
272d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
272e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
272f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
27300 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
27310 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
27320 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
27330 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27340 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
27350 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27360 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
27370 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
27380 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
27390 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73  E_OMIT_WAL.  ass
273a0 65 72 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65  ert( db || pPage
273b0 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20  r->pWal==0 );.  
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 64 62  pPager->pWal, db
273e0 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
273f0 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
27400 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
27410 20 28 64 62 20 26 26 20 28 64 62 2d 3e 66 6c 61   (db && (db->fla
27420 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b  gs & SQLITE_NoCk
27430 70 74 4f 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a  ptOnClose) ? 0 :
27440 20 70 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50   pTmp).  );.  pP
27450 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
27460 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
27470 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
27480 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
27490 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
274a0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
274b0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
274c0 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
274d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
274e0 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
274f0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
27500 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
27510 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
27520 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
27530 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
27540 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
27550 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
27560 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
27570 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
27580 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
27590 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
275a0 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
275b0 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
275c0 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
275d0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
275e0 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
275f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
27600 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
27610 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
27620 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
27630 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
27640 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
27650 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
27660 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
27670 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
27680 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
27690 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
276a0 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
276b0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
276c0 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
276d0 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
276e0 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
276f0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
27700 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
27710 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
27720 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
27730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27740 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
27750 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27760 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
27770 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27780 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
27790 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
277a0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
277b0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
277c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
277d0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
277e0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
277f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
27800 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
27810 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
27820 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27830 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
27840 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
27850 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
27860 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
27870 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
27880 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27890 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
278a0 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
278b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
278c0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
278d0 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
278e0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
278f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
27900 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
27910 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
27920 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
27930 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
27940 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
27950 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
27960 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
27970 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27980 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27990 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
279a0 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
279b0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
279c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
279d0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
279e0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
279f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
27a00 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
27a10 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
27a20 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
27a30 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
27a40 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
27a50 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27a60 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
27a70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27a80 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
27a90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27aa0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
27ab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
27ac0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
27ad0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
27ae0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
27af0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
27b00 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
27b10 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
27b20 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
27b30 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
27b40 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
27b50 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
27b60 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
27b70 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
27b80 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
27b90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
27ba0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
27bb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
27bc0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
27bd0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
27be0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
27bf0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27c00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
27c10 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
27c20 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
27c30 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
27c40 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
27c50 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
27c60 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
27c70 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
27c80 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
27c90 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
27ca0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
27cb0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
27cc0 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
27cd0 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
27ce0 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
27cf0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
27d00 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
27d10 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
27d20 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
27d30 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
27d40 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
27d50 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
27d60 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
27d70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
27d80 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
27d90 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
27da0 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
27db0 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
27dc0 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
27dd0 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
27de0 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
27df0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
27e00 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
27e10 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
27e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27e30 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
27e40 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
27e50 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
27e60 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
27e70 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
27e80 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
27e90 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
27ea0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
27eb0 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
27ec0 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
27ed0 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
27ee0 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
27ef0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
27f00 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
27f10 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
27f20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
27f30 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
27f40 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
27f50 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
27f60 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
27f70 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
27f80 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
27f90 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
27fa0 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
27fb0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
27fc0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
27fd0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
27fe0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
27ff0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
28000 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
28010 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
28020 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
28030 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
28040 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
28050 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
28060 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
28070 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28080 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
28090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
280a0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
280b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
280c0 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
280d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
280e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
280f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
28100 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
28110 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
28120 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
28130 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
28140 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
28150 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
28160 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
28170 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
28180 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
28190 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
281a0 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
281b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
281c0 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
281d0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
281e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
281f0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
28200 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
28210 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
28220 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
28230 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
28240 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
28250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
28260 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
28270 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
28280 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
28290 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
282a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
282b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
282c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
282d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
282e0 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
282f0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
28300 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
28310 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
28320 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
28330 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
28340 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
28350 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
28360 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
28370 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
28380 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
28390 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
283a0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
283b0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
283c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
283d0 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
283e0 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
283f0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
28400 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
28410 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
28420 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
28430 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
28440 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
28450 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
28460 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
28470 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
28480 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
28490 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
284a0 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
284b0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
284c0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
284d0 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
284e0 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
284f0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
28500 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
28510 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
28520 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
28530 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
28540 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
28550 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
28560 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
28570 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
28580 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
28590 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
285a0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
285b0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
285c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
285d0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
285e0 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
285f0 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
28600 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
28610 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
28620 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
28630 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
28640 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
28650 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
28660 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
28670 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
28680 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
28690 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
286a0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
286b0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
286c0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
286d0 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
286e0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
286f0 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
28700 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
28710 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
28720 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
28730 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
28740 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
28750 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
28760 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
28770 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28780 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
28790 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
287a0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
287b0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
287c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
287d0 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
287e0 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
287f0 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
28800 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
28810 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
28820 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
28830 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
28840 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
28850 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
28860 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
28870 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
28880 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
28890 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
288a0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
288b0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
288c0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
288d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
288e0 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
288f0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
28900 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
28910 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28920 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
28930 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
28940 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28950 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
28960 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
28970 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
28980 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
28990 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
289a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
289b0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
289c0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
289d0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
289e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
289f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
28a00 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
28a10 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
28a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
28a30 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
28a40 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
28a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28a60 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
28a70 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
28a80 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
28a90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
28aa0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28ab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
28ac0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
28ad0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
28ae0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28af0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
28b00 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
28b10 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
28b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28b30 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
28b40 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
28b50 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
28b60 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
28b70 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
28b80 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
28b90 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
28ba0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
28bb0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
28bc0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
28bd0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
28be0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
28bf0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
28c00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28c10 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
28c20 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
28c30 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
28c40 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
28c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
28c60 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
28c70 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
28c80 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
28c90 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
28ca0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
28cb0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
28cc0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
28cd0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
28ce0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
28cf0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
28d00 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
28d10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
28d20 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
28d30 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
28d40 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
28d50 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
28d60 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
28d70 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
28d80 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
28d90 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
28da0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
28db0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
28dc0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
28dd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28de0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
28df0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
28e00 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
28e10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28e20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
28e30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28e40 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
28e50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
28e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28e70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28e80 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
28e90 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
28ea0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
28eb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
28ec0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28ed0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
28ef0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
28f00 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
28f10 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
28f20 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
28f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28f50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28f60 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
28f70 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28f80 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
28f90 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28fa0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
28fb0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
28fc0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
28fd0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28fe0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28ff0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
29000 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
29010 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
29020 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
29030 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
29040 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
29050 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
29060 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
29070 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
29080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
290a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
290b0 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
290c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
290d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
290e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
290f0 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
29100 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
29110 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
29120 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
29130 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
29140 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
29150 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
29160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29170 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
29190 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
291a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
291b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
291c0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
291d0 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
291e0 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
291f0 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
29200 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
29210 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
29220 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
29230 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
29240 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
29250 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
29260 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
29270 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
29280 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
29290 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
292a0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
292b0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
292c0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
292d0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
292e0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
292f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29300 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
29310 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
29320 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
29330 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
29340 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
29350 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
29360 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
29370 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
29380 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
29390 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
293a0 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
293b0 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
293c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
293d0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
293e0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
293f0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
29400 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
29410 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29420 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
29430 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
29440 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
29450 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
29460 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
29470 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
29480 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
29490 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
294a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
294b0 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
294c0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
294d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
294e0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
294f0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
29500 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
29510 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
29520 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
29530 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29540 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
29550 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
29560 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
29570 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
29580 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
29590 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
295a0 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
295b0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
295c0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
295d0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
295e0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
295f0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
29600 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
29610 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
29620 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
29630 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
29640 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
29650 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
29660 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
29670 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
29680 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
29690 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
296a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
296b0 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
296c0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
296d0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
296e0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
296f0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
29700 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29710 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
29720 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
29730 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
29740 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
29750 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
29760 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
29770 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
29780 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29790 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
297a0 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
297b0 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
297c0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
297d0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
297e0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
297f0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
29800 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
29810 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
29820 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
29830 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
29840 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29850 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
29860 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
29870 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
29880 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
29890 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
298a0 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
298b0 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
298c0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
298d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
298e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
298f0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
29900 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
29910 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
29920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29940 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29950 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
29960 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
29970 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
29980 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
29990 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
299a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
299b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
299c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
299d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
299e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
299f0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
29a00 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
29a10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
29a20 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
29a30 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
29a40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29a50 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72  ) || pList->pDir
29a60 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
29a70 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
29a80 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
29a90 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
29aa0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
29ab0 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
29ac0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
29ad0 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
29ae0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
29af0 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
29b00 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
29b10 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
29b20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
29b30 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
29b40 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
29b50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
29b60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29b70 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
29b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
29b90 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
29ba0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
29bb0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
29bc0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
29bd0 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
29be0 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
29bf0 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
29c00 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
29c10 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
29c20 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
29c30 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
29c40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
29c50 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
29c60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
29c70 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61  TE_OK .   && pPa
29c80 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c  ger->dbHintSize<
29c90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20  pPager->dbSize. 
29ca0 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
29cb0 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  rty || pList->pg
29cc0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  no>pPager->dbHin
29cd0 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20  tSize).  ){.    
29ce0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
29cf0 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
29d00 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
29d10 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
29d20 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
29d30 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
29d40 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
29d50 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
29d60 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
29d70 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
29d80 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
29d90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
29da0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
29db0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
29dc0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
29dd0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
29de0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
29df0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
29e00 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
29e10 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
29e20 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
29e30 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
29e40 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
29e50 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
29e60 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
29e70 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
29e80 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
29e90 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
29ea0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
29eb0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
29ec0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
29ed0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
29ee0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
29ef0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
29f00 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
29f10 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
29f20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
29f30 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
29f40 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
29f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
29f60 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
29f70 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
29f80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
29f90 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
29fa0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
29fb0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
29fc0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
29fd0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
29fe0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
29ff0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
2a000 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
2a010 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2a040 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
2a050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2a060 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2a070 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2a080 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
2a090 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
2a0a0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
2a0b0 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
2a0c0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
2a0d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
2a0e0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
2a0f0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
2a100 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
2a110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a120 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a  M_BKPT, pData);.
2a130 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
2a140 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
2a150 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
2a160 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2a170 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
2a180 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
2a190 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
2a1a0 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
2a1b0 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
2a1c0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
2a1d0 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
2a1e0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
2a1f0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
2a200 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
2a210 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
2a220 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
2a230 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
2a240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a250 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
2a260 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
2a270 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2a280 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
2a290 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2a2a0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2a2b0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
2a2c0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
2a2d0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
2a2e0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
2a2f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2a300 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
2a310 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2a320 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
2a330 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
2a340 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
2a350 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
2a360 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
2a370 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
2a380 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
2a390 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
2a3a0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
2a3b0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
2a3c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
2a3d0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
2a3e0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
2a3f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a400 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
2a410 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a440 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
2a450 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
2a460 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2a470 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
2a480 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2a490 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
2a4a0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
2a4b0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
2a4c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a4d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
2a4e0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2a4f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a500 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
2a510 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
2a520 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
2a530 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
2a540 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2a550 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2a560 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
2a570 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
2a580 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2a590 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
2a5a0 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
2a5b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2a5c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
2a5d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a5e0 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
2a5f0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
2a600 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
2a610 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
2a620 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
2a630 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
2a640 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
2a650 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
2a660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2a670 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
2a680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a690 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a6a0 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
2a6b0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2a6c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
2a6d0 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45   flags =  SQLITE
2a6e0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2a6f0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
2a700 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20  EADWRITE .      
2a710 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
2a720 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
2a730 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20  EN_EXCLUSIVE .  
2a740 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2a750 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
2a760 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70  .    int nStmtSp
2a770 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  ill = sqlite3Con
2a780 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a  fig.nStmtSpill;.
2a790 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2a7a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2a7b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2a7c0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2a7d0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2a7e0 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c  .      nStmtSpil
2a7f0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  l = -1;.    }.  
2a800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2a810 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2a820 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65  ->pVfs, 0, pPage
2a830 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20  r->sjfd, flags, 
2a840 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d  nStmtSpill);.  }
2a850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a860 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
2a870 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
2a880 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
2a890 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
2a8a0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a  ub-journal. .**.
2a8b0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2a8c0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2a8d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2a8e0 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2a8f0 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2a900 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2a910 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2a920 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2a930 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a940 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2a950 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2a960 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2a970 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2a980 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2a990 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2a9a0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2a9b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2a9c0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2a9d0 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2a9e0 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2a9f0 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2aa00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2aa10 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2aa20 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2aa30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aa40 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2aa50 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2aa60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2aa70 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2aa80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2aa90 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2aaa0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2aab0 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2aac0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2aad0 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2aae0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2aaf0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2ab00 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2ab10 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2ab20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ab30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ab40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2ab50 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2ab60 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2ab70 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2ab80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2ab90 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2aba0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2abb0 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2abc0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2abd0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2abe0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2abf0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2ac00 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2ac10 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2ac20 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2ac30 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2ac40 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2ac50 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2ac60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2ac70 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2ac80 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2ac90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2aca0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2acb0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2acc0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2acd0 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2ace0 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2acf0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2ad00 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2ad10 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2ad20 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2ad30 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2ad40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ad50 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b  M_BKPT, pData2);
2ad60 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2ad70 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2ad80 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2ad90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2ada0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2adb0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2adc0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2add0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2ade0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2adf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ae00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2ae10 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2ae20 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2ae30 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2ae40 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2ae50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ae60 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2ae70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2ae80 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2ae90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2aea0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2aeb0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2aec0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2aed0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2aee0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2aef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2af00 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2af10 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50  PageIfRequired(P
2af20 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
2af30 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2af40 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72  ge(pPg) ){.    r
2af50 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c  eturn subjournal
2af60 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
2af70 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
2af80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
2af90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2afa0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2afb0 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2afc0 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2afd0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2afe0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2aff0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2b000 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2b010 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2b020 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2b030 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2b040 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2b050 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2b060 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2b070 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2b080 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2b090 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2b0a0 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2b0b0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2b0c0 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2b0d0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2b0e0 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2b0f0 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2b100 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2b110 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2b120 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2b130 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2b140 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2b150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2b160 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2b170 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2b180 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2b190 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2b1a0 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2b1b0 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2b1c0 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2b1d0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2b1e0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2b1f0 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2b200 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b210 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2b220 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2b230 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2b240 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2b250 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2b260 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2b270 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2b280 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2b290 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2b2a0 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2b2b0 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2b2c0 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2b2d0 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2b2e0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2b2f0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2b300 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2b310 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2b320 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2b330 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2b340 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2b350 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2b360 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2b370 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2b380 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2b390 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2b3a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2b3b0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2b3c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2b3d0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2b3e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
2b3f0 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
2b400 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  it is set during
2b410 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
2b420 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
2b430 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
2b440 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
2b450 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
2b460 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
2b470 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
2b480 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2b490 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
2b4a0 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
2b4b0 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
2b4c0 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
2b4d0 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
2b4e0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
2b4f0 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c   doNotSpill ROLL
2b500 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74  BACK and OFF bit
2b510 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  s inhibits all c
2b520 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20  ache spilling.  
2b530 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ** regardless of
2b540 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2b550 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2b560 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2b570 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72   during.  ** a r
2b580 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73  ollback or by us
2b590 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70  er request, resp
2b5a0 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20  ectively..  **. 
2b5b0 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2b5c0 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2b5d0 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2b5e0 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2b5f0 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2b600 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2b610 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2b620 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2b630 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20  mentation it .  
2b640 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2b650 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2b660 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2b670 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2b680 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77  teFlag==3.  ** w
2b690 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2b6a0 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2b6b0 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2b6c0 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2b6d0 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2b6e0 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2b6f0 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2b700 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2b710 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2b720 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2b730 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2b740 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2b750 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2b760 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2b770 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2b780 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2b790 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65  E_OK;.  testcase
2b7a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b7b0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b7c0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74  _ROLLBACK );.  t
2b7d0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b7e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b7f0 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20  ILLFLAG_OFF );. 
2b800 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b810 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b820 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
2b830 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2b840 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20  ->doNotSpill.   
2b850 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e  && ((pPager->doN
2b860 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c  otSpill & (SPILL
2b870 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50  FLAG_ROLLBACK|SP
2b880 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30  ILLFLAG_OFF))!=0
2b890 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
2b8a0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
2b8b0 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29  ED_SYNC)!=0).  )
2b8c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b8d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2b8e0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2b8f0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2b900 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2b910 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2b920 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2b930 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2b940 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2b950 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2b960 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20  equired(pPg); . 
2b970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2b990 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2b9a0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2b9b0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2b9c0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2b9d0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2b9e0 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2b9f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2ba00 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2ba10 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2ba20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ba30 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2ba40 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2ba50 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2ba60 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2ba70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2ba80 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
2ba90 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2baa0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2bab0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2bac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2bae0 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
2baf0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2bb00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
2bb10 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2bb20 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
2bb30 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
2bb40 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2bb50 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
2bb60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bb70 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
2bb80 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
2bb90 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2bba0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2bbb0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2bbc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2bbd0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
2bbe0 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
2bbf0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2bc00 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  c); .}../*.** Fl
2bc10 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ush all unrefere
2bc20 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73  nced dirty pages
2bc30 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
2bc40 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75   sqlite3PagerFlu
2bc50 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  sh(Pager *pPager
2bc60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
2bc70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2bc80 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2bc90 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
2bca0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2bcb0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2bcc0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61  >pPCache);.    a
2bcd0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
2bce0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
2bcf0 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) );.    while( 
2bd00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bd10 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
2bd20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
2bd30 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2bd40 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
2bd50 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
2bd60 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65    rc = pagerStre
2bd70 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72  ss((void*)pPager
2bd80 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
2bd90 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  }.      pList = 
2bda0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2bdb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2bdc0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2bdd0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2bde0 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2bdf0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2be00 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2be10 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2be20 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2be30 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2be40 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2be50 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2be60 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2be70 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2be80 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2be90 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2bea0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2beb0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2bec0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2bed0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2bee0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2bef0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2bf00 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2bf10 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2bf20 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2bf30 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2bf40 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2bf50 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2bf60 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2bf70 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2bf80 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2bf90 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2bfa0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2bfb0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2bfc0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2bfd0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2bfe0 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2bff0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2c000 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2c010 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2c020 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2c030 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2c040 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2c050 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2c060 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2c070 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2c080 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2c090 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2c0a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2c0b0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
2c0c0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2c0d0 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2c0e0 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2c0f0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2c100 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2c110 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2c120 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2c130 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2c140 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2c150 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2c160 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2c170 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2c180 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2c190 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2c1a0 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2c1b0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2c1c0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2c1d0 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2c1e0 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2c1f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2c200 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2c210 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2c220 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2c230 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2c240 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2c250 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2c260 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2c270 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2c280 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2c290 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2c2a0 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2c2b0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2c2c0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2c2d0 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2c2e0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2c2f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2c300 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2c310 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2c320 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2c330 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2c340 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2c350 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2c360 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2c370 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2c380 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2c390 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2c3a0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2c3b0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2c3c0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2c3d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2c3e0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2c3f0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2c400 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2c410 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2c420 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2c430 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2c440 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2c450 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2c460 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2c470 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2c480 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2c490 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2c4b0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2c4c0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2c4d0 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2c4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2c4f0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2c500 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2c510 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2c520 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2c530 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2c540 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2c550 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2c560 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2c570 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2c580 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2c590 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2c5a0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2c5b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c5c0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2c5d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2c5e0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2c5f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2c600 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2c610 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2c620 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2c630 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2c640 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c650 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2c660 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2c670 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2c680 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c690 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2c6a0 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2c6b0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2c6c0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2c6d0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c6e0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2c6f0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2c700 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2c710 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2c720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2c730 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2c740 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2c750 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c760 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2c770 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2c780 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2c790 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2c7a0 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2c7b0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2c7c0 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2c7d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2c7e0 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2c7f0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c800 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2c810 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2c820 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2c830 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2c840 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2c850 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2c860 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2c870 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2c880 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2c890 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2c8a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c8b0 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2c8c0 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2c8d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2c8e0 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2c8f0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2c900 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2c910 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2c920 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2c930 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2c940 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2c950 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20  -journal).  */. 
2c960 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c970 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c980 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c990 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  s));..  /* Set t
2c9a0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2c9b0 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2c9c0 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2c9d0 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2c9e0 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2c9f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2ca00 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2ca10 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2ca20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2ca30 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2ca40 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2ca50 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2ca60 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2ca70 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2ca80 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2ca90 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2caa0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2cab0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2cac0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2cad0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2cae0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2caf0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2cb00 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2cb10 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2cb20 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2cb30 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2cb40 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2cb50 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2cb60 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2cb70 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2cb80 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2cb90 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2cba0 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2cbb0 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2cbc0 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2cbd0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2cbe0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2cbf0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2cc00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2cc10 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2cc20 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2cc30 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2cc40 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2cc50 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2cc60 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2cc70 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2cc80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2cc90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2cca0 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2ccb0 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2ccc0 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2ccd0 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2cce0 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2ccf0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2cd00 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2cd10 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2cd20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2cd30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2cd40 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2cd50 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2cd60 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2cd70 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2cd80 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2cd90 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2cda0 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2cdb0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2cdc0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2cdd0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2cde0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2cdf0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2ce00 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2ce10 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2ce20 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2ce30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ce40 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2ce50 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2ce60 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2ce70 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2ce80 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2ce90 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2cea0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2ceb0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2cec0 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2ced0 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2cee0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2cef0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2cf00 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2cf10 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2cf20 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2cf30 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2cf40 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2cf50 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2cf60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2cf70 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2cf80 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2cf90 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2cfa0 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2cfb0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2cfc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2cfd0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2cfe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2d000 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d010 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2d020 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2d030 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2d040 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2d050 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2d060 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2d070 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2d080 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2d090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d0a0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2d0b0 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2d0c0 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2d0d0 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2d0e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2d0f0 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2d100 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2d110 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2d120 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2d130 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2d140 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2d150 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d160 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2d170 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2d180 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2d190 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2d1a0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2d1b0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2d1c0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2d1d0 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2d1e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2d1f0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2d200 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2d210 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2d220 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2d230 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2d240 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2d250 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2d260 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2d270 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2d280 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2d290 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2d2a0 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2d2b0 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2d2c0 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2d2d0 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2d2e0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2d2f0 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2d300 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2d310 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2d320 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2d330 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2d340 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2d350 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d360 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2d370 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2d380 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2d390 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2d3a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2d3b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2d3c0 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2d3d0 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2d3e0 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2d3f0 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2d400 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2d410 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2d420 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2d430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d440 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2d450 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2d460 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2d470 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2d480 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2d490 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2d4a0 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2d4b0 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2d4c0 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2d4d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d4e0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d4f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d500 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d510 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2d520 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2d530 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2d540 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2d550 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2d560 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2d570 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2d580 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2d590 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2d5a0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2d5b0 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2d5c0 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2d5d0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2d5e0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2d5f0 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2d600 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2d610 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2d620 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2d630 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2d640 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2d650 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2d660 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d680 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d690 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2d6a0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2d6b0 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2d6c0 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2d6d0 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2d6e0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2d6f0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2d700 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2d710 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2d720 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2d730 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2d740 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2d750 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2d760 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d770 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2d780 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d790 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2d7a0 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2d7b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2d7c0 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2d7d0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d7e0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2d7f0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2d800 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2d810 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2d820 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d830 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2d840 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2d850 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2d860 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d870 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2d880 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2d890 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2d8a0 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2d8b0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2d8c0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2d8d0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2d8e0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2d8f0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d900 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d910 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2d920 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2d930 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2d940 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d950 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d960 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2d970 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2d980 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2d990 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2d9a0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2d9b0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2d9c0 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2d9d0 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2d9e0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2d9f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2da00 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2da10 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2da20 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da40 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2da50 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2da60 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2da70 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2da80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2da90 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2daa0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2dab0 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2dac0 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2dad0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2dae0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2daf0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2db00 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2db10 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2db20 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2db30 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2db40 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2db50 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2db60 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2db70 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2db80 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2db90 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2dba0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2dbb0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2dbc0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2dbd0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2dbe0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2dbf0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2dc00 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2dc10 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2dc20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2dc30 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2dc40 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2dc50 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2dc60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2dc70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dc80 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2dc90 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2dca0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2dcb0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
2dcc0 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2dcd0 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2dce0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2dcf0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2dd00 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2dd10 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2dd20 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dd30 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
2dd40 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2dd50 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2dd60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2dd70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2dd80 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2dd90 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2dda0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2ddb0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2ddc0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2ddd0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2dde0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ddf0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2de00 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2de10 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2de20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de30 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2de40 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2de50 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
2de60 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
2de70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2de80 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2de90 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2dea0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2deb0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2dec0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2ded0 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2dee0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2def0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2df00 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2df10 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2df20 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2df30 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2df40 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2df50 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2df60 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2df70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2df80 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
2dfa0 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2dfb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2dfc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dfd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2dfe0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2dff0 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  noLock = sqlite3
2e000 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2e010 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22  lename, "nolock"
2e020 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2e030 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
2e040 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d  CAP_IMMUTABLE)!=
2e050 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
2e060 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2e070 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75  zFilename, "immu
2e080 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20  table", 0) ){.  
2e090 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
2e0a0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2e0b0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2e0c0 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b      goto act_lik
2e0d0 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20  e_temp_file;.   
2e0e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2e0f0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2e100 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2e110 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2e120 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2e130 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2e140 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2e150 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2e160 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2e170 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2e180 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2e190 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2e1a0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2e1b0 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2e1c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2e1d0 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2e1e0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2e1f0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2e200 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2e210 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2e220 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2e230 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2e240 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2e250 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2e260 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2e270 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2e280 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  urnal..    **.  
2e290 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2e2a0 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66   also runs for f
2e2b0 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69  iles marked as i
2e2c0 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  mmutable..    */
2e2d0 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f   .act_like_temp_
2e2e0 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69  file:.    tempFi
2e2f0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2e300 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2e310 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f  ER_READER;     /
2e320 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72  * Pretend we alr
2e330 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
2e340 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2e350 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2e360 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72  E_LOCK;    /* Pr
2e370 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20  etend we are in 
2e380 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a  EXCLUSIVE mode *
2e390 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2e3a0 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2e3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2e3c0 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2e3d0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2e3e0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2e3f0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2e400 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2e410 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2e420 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2e430 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2e440 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2e450 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2e460 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2e470 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2e480 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2e490 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e4a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e4b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2e4c0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2e4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2e4e0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2e4f0 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2e500 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2e510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e520 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2e530 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2e540 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2e550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e560 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e570 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e580 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
2e590 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
2e5a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2e5b0 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2e5c0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2e5d0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2e5e0 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2e5f0 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2e600 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2e610 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2e630 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2e640 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2e650 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72    Pager structur
2e660 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2e670 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2e680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e690 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
2e6a0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2e6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2e6c0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
2e6d0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71  mpSpace);.    sq
2e6e0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2e6f0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2e700 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
2e710 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2e720 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2e730 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2e740 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e750 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2e760 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2e770 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2e780 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2e790 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2e7a0 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2e7b0 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2e7c0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2e7d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e7e0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2e7f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2e800 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2e810 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2e820 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e830 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2e840 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e850 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2e860 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2e870 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2e880 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2e890 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2e8a0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2e8b0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e8c0 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2e8d0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2e8e0 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2e8f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2e900 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e910 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2e920 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2e930 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e940 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e950 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2e960 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2e970 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2e980 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2e990 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2e9a0 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2e9b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2e9c0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2e9d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2e9e0 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2e9f0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2ea00 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2ea10 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2ea20 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2ea30 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2ea40 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2ea50 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2ea60 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
2ea70 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2ea80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ea90 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2eaa0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2eab0 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  ( pPager->extraS
2eac0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2ead0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2eae0 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2eaf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eb00 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2eb10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2eb20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2eb30 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2eb40 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2eb50 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2eb60 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
2eb70 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  aSync = 0;.    p
2eb80 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2eb90 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2eba0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2ebb0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2ebc0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2ebd0 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2ebe0 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2ebf0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2ec00 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2ec10 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2ec20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2ec30 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2ec40 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2ec50 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2ec60 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2ec70 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2ec80 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2ec90 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2eca0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2ecb0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2ecc0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2ecd0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2ece0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2ecf0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2ed00 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2ed10 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2ed20 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2ed30 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2ed40 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2ed50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ed60 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2ed70 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2ed80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ed90 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2eda0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2edb0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2edc0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2edd0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ede0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2edf0 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2ee00 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2ee10 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2ee20 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2ee30 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2ee40 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2ee50 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2ee60 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2ee70 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2ee80 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2ee90 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2eea0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2eeb0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2eec0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2eed0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2eee0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2eef0 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2ef00 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2ef10 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2ef20 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2ef30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2ef40 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2ef50 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2ef60 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2ef70 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2ef80 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2ef90 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2efa0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2efb0 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2efc0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2efd0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2efe0 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2eff0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2f000 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2f010 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2f020 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2f030 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2f040 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2f050 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2f060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f070 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2f080 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2f090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2f0a0 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2f0b0 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2f0c0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2f0d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2f0e0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2f0f0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2f100 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2f110 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2f120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2f130 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2f140 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2f150 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2f160 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2f170 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2f180 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2f190 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2f1a0 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2f1b0 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2f1c0 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2f1d0 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2f1e0 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2f1f0 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2f200 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2f210 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2f220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f230 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2f240 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2f250 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2f260 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f270 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2f280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f290 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2f2a0 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2f2b0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2f2c0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2f2d0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2f2e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2f2f0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2f300 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2f310 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2f320 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2f330 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2f340 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2f350 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2f360 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2f370 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2f380 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2f390 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2f3a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2f3b0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2f3c0 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2f3d0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2f3e0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2f3f0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2f400 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f410 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2f420 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f440 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2f450 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2f460 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2f470 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2f480 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2f490 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2f4a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f4b0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2f4c0 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2f4d0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2f4e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f4f0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2f500 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2f510 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2f520 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2f530 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2f540 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2f550 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2f560 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2f570 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2f580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f590 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2f5a0 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2f5b0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2f5c0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f5d0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2f5e0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2f5f0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2f600 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2f610 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2f620 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2f630 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2f640 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f650 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2f660 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f670 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2f680 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2f690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f6a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2f6b0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2f6c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2f6d0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2f6e0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2f6f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2f700 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2f710 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2f720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f730 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f740 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2f750 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2f760 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2f770 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f780 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2f790 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f7a0 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2f7b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f7c0 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2f7d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f7e0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2f7f0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2f800 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f810 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2f820 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2f830 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2f840 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2f850 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2f860 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f870 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2f880 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2f890 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f8a0 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2f8b0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2f8c0 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2f8d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2f8e0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2f8f0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2f900 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2f910 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2f920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f930 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2f940 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2f950 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2f960 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f970 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2f980 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f990 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2f9a0 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2f9b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f9c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2f9d0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2f9f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2fa00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2fa10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2fa20 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2fa30 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2fa40 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2fa50 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2fa60 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2fa70 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2fa80 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2fa90 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2faa0 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2fab0 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2fac0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2fad0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2fae0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2faf0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2fb00 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2fb10 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2fb20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fb30 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2fb40 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fb60 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2fb70 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2fb80 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2fb90 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2fba0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2fbb0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2fbc0 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2fbd0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2fbe0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2fbf0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2fc00 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2fc10 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2fc20 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2fc30 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2fc40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2fc50 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2fc60 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2fc70 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2fc80 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2fc90 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2fca0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2fcb0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2fcc0 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2fcd0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2fce0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2fcf0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2fd00 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2fd10 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2fd20 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2fd30 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2fd40 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2fd50 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2fd60 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2fd70 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2fd80 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2fd90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2fda0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2fdb0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2fdc0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2fdd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fde0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2fdf0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe10 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2fe20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2fe30 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
2fe40 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
2fe50 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile==0 );.      
2fe60 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2fe70 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2fe80 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2fe90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fea0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2feb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
2fec0 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
2fed0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
2fee0 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
2fef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
2ff00 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
2ff10 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
2ff20 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2ff30 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
2ff40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
2ff50 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
2ff60 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
2ff70 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
2ff80 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
2ff90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
2ffa0 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
2ffb0 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
2ffc0 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
2ffd0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
2ffe0 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
2fff0 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
30000 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
30010 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
30020 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
30030 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
30040 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30050 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
30060 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
30070 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
30080 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
30090 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
300a0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
300b0 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
300c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
300d0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
300e0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
300f0 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
30100 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
30110 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
30120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30130 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
30140 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
30150 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
30160 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30170 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
30180 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
30190 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
301a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
301b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
301c0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
301d0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
301e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
301f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
30200 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30210 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
30220 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
30230 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
30240 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
30250 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30260 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
30270 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
30280 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
30290 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
302a0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
302b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
302c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
302d0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
302e0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
302f0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
30300 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
30310 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
30320 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
30330 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
30340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30350 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
30370 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
30380 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
30390 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
303a0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
303b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
303c0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
303d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
303e0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
303f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30400 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30420 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
30430 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
30440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30450 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
30460 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
30470 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30480 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30490 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
304a0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
304b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
304c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
304d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
304e0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
304f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30500 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30510 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30520 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30530 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30540 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
30550 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
30560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
30570 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30580 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
30590 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
305a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
305b0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
305c0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
305d0 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
305e0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
305f0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30600 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
30610 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
30620 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
30630 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
30640 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
30650 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
30660 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
30670 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30680 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
30690 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
306a0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
306b0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
306c0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
306d0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
306e0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
306f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
30700 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
30710 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
30720 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
30730 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
30740 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
30750 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30760 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30770 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30780 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30790 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
307a0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
307b0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
307c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
307d0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
307e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
307f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30820 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
30830 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30840 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30850 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
30860 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
30870 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30880 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30890 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
308a0 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
308b0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
308c0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
308d0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
308e0 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
308f0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30900 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30910 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30920 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30930 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
30940 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
30950 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
30960 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
30970 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
30980 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
30990 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
309a0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
309b0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
309c0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
309d0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
309e0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
309f0 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30a00 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30a10 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
30a20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
30a30 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
30a40 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
30a50 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
30a60 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
30a70 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30a80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30a90 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30aa0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30ab0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30ac0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30ad0 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30ae0 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30af0 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30b00 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30b10 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
30b20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
30b30 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
30b40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30b50 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
30b60 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
30b70 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
30b80 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
30b90 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
30ba0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
30bb0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30bc0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30bd0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30be0 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30bf0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30c00 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30c10 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
30c20 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
30c30 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30c40 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
30c50 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
30c60 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
30c70 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
30c80 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30c90 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
30ca0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
30cb0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30cc0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30cd0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30ce0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30cf0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30d00 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30d10 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
30d20 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
30d30 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
30d40 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
30d50 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
30d60 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
30d70 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30d80 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30d90 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30db0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30dc0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30dd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30df0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30e00 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30e10 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30e20 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30e30 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30e40 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30e50 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
30e60 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30e70 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
30e80 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
30e90 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
30ea0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
30eb0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30ec0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30ed0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30ee0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30ef0 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
30f00 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
30f10 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30f20 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
30f30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
30f40 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
30f50 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
30f60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30f70 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
30f80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
30f90 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
30fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30fb0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
30fc0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
30fd0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
30fe0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
30ff0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31000 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
31010 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
31020 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31030 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
31040 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
31050 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
31060 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
31070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31080 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
31090 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
310a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
310b0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
310c0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
310d0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
310e0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
310f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31110 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
31120 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
31130 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
31140 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
31150 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
31160 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
31170 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
31180 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
31190 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
311a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
311b0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
311c0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
311d0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
311e0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
311f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
31200 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
31210 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
31220 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
31230 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
31240 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
31250 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31270 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31280 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
31290 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
312a0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
312b0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
312c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
312d0 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
312e0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
312f0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
31300 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
31310 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
31320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31330 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
31340 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
31350 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
31360 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
31370 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
31380 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
31390 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
313a0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
313b0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
313c0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
313d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
313e0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
313f0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
31400 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
31410 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
31420 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
31430 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
31440 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31450 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
31460 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
31470 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
31480 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
31490 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
314a0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
314b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
314c0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
314d0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
314e0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
314f0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
31500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31510 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
31520 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
31530 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
31540 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
31550 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
31560 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
31570 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31580 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
31590 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
315a0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
315b0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
315c0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
315d0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
315e0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
315f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
31600 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
31610 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
31620 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31630 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31640 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31670 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31680 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
31690 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
316a0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
316b0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
316c0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
316d0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
316e0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
316f0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
31700 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
31710 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31720 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31730 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
31740 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31750 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31760 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31770 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31780 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
31790 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
317a0 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
317b0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
317c0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
317d0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
317e0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
317f0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
31800 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
31810 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
31820 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
31830 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
31840 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
31850 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31860 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
31870 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
31880 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
31890 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
318a0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
318b0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
318c0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
318d0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
318e0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
318f0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
31900 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
31910 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
31920 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
31930 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
31940 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
31950 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
31960 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
31970 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
31980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31990 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
319a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
319b0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
319c0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
319d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
319e0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
319f0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
31a00 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
31a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31a20 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
31a30 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
31a40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31a50 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
31a60 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
31a70 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31a80 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
31a90 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
31aa0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
31ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31ac0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
31ad0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
31ae0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
31af0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
31b00 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
31b10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31b20 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31b30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
31b40 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
31b50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31b60 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31b70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31b80 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31b90 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
31ba0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31bb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
31bc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
31be0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31bf0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
31c00 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
31c10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31c20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
31c30 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
31c40 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
31c50 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
31c60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
31c80 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
31c90 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
31ca0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
31cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
31cc0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
31cd0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
31ce0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
31cf0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
31d00 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
31d10 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
31d20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
31d30 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
31d40 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
31d50 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
31d60 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
31d70 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
31d80 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
31d90 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
31da0 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
31db0 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
31dc0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
31dd0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
31de0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
31df0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
31e00 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
31e10 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
31e20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31e30 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
31e40 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
31e50 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
31e60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31e70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31e90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31ea0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
31eb0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
31ec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31ed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31ee0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
31ef0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
31f00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
31f10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  e);.          pP
31f20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31f30 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
31f40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
31f50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
31f60 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
31f70 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
31f80 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31f90 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31fa0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
31fb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31fc0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
31fd0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
31fe0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31ff0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
32000 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
32010 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
32020 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
32030 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
32040 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
32050 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
32060 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
32070 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
32080 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
32090 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
320a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
320b0 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
320c0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
320d0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
320e0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
320f0 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
32100 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
32110 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
32120 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
32130 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
32140 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
32150 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
32160 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
32170 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
32180 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
32190 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
321a0 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
321b0 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
321c0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
321d0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
321e0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
321f0 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
32200 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
32210 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
32220 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
32230 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
32240 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
32250 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
32260 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
32270 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
32280 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
32290 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
322a0 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
322b0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
322c0 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
322d0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
322e0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
322f0 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
32300 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
32310 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
32320 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
32330 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
32340 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
32350 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
32360 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
32370 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
32380 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
32390 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
323a0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
323b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
323c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
323d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
323e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
323f0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
32400 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
32410 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
32420 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
32430 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
32440 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
32450 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
32460 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32470 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
32480 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
32490 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
324a0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
324b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
324c0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
324d0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
324e0 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
324f0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
32500 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
32510 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
32520 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
32530 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
32540 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
32550 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
32560 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32570 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
32580 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
32590 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
325a0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
325b0 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
325c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
325d0 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
325e0 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
325f0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
32600 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
32610 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
32620 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
32630 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
32640 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
32650 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
32660 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
32670 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
32680 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
32690 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
326a0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
326b0 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
326c0 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
326d0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
326e0 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
326f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
32700 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
32710 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
32720 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
32730 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
32740 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
32750 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32760 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
32770 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
32780 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
32790 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
327a0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
327b0 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
327c0 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
327d0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
327e0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
327f0 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
32800 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
32810 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
32820 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
32830 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
32840 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
32850 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
32860 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
32870 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
32880 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
32890 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
328a0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
328b0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
328c0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
328d0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
328e0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
328f0 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
32900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
32910 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
32920 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32930 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
32940 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
32950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
32960 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
32970 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
32980 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
32990 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
329a0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
329b0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
329c0 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
329d0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
329e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
329f0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
32a00 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
32a10 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32a20 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
32a30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
32a40 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
32a50 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
32a60 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
32a70 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
32a80 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
32a90 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
32aa0 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
32ab0 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
32ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32ad0 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
32ae0 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
32af0 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
32b00 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
32b10 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
32b20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
32b30 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
32b40 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
32b50 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
32b60 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
32b70 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
32b80 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
32b90 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
32ba0 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
32bb0 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
32bc0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
32bd0 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
32be0 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
32bf0 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
32c00 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
32c10 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
32c20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
32c30 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
32c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
32c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
32c60 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
32c70 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
32c80 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
32c90 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
32ca0 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
32cb0 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
32cc0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
32cd0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
32ce0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
32cf0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
32d00 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
32d10 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
32d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
32d30 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
32d40 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
32d50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32d60 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
32d70 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
32d80 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
32d90 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32da0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
32db0 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
32dc0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32dd0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
32de0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
32df0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  =0 && pPager->eS
32e00 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32e10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32e20 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
32e30 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32e40 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
32e50 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
32e60 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
32e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e80 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32e90 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
32ea0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
32eb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32ec0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32ed0 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
32ee0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32ef0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
32f00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61  ;.    pPager->ha
32f10 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
32f20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
32f30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
32f40 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
32f50 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
32f60 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
32f70 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
32f80 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
32f90 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
32fa0 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
32fb0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
32fc0 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
32fd0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
32fe0 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
32ff0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
33000 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
33010 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
33020 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
33030 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
33040 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
33050 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
33060 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
33070 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
33080 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33090 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
330a0 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
330b0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
330c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
330d0 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
330e0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
330f0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
33100 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
33110 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
33120 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
33130 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
33140 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
33150 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
33160 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
33170 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
33180 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
33190 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
331a0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
331b0 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
331c0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
331d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
331e0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
331f0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
33200 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
33210 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
33220 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
33230 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
33240 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
33250 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
33260 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
33270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33280 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
33290 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
332a0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
332b0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
332c0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
332d0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
332e0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
332f0 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
33300 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
33310 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
33320 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
33330 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
33340 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
33350 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
33360 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
33370 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
33380 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
33390 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
333a0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
333b0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
333c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
333d0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
333e0 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
333f0 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
33400 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
33410 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
33420 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
33430 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33440 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
33450 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
33460 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
33470 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
33480 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
33490 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
334a0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
334b0 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
334c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
334d0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
334e0 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
334f0 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
33500 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
33510 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
33520 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
33530 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
33540 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
33550 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
33560 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
33570 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
33580 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
33590 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
335a0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
335b0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
335c0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
335d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
335e0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
335f0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
33600 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33610 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
33620 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
33630 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
33640 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
33650 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
33660 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
33670 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
33680 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
33690 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
336a0 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
336b0 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
336c0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
336d0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
336e0 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
336f0 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
33700 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
33710 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
33720 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
33730 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
33740 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
33750 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
33760 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
33770 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
33780 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
33790 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
337a0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
337b0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
337c0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
337d0 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
337e0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
337f0 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
33800 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
33810 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
33820 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
33830 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
33840 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
33850 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33860 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
33870 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
33880 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
33890 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
338a0 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
338b0 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
338c0 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
338d0 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
338e0 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
338f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
33900 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
33910 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
33920 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
33930 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
33940 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
33950 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
33960 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
33970 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
33980 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
33990 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
339a0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
339b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
339c0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
339d0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
339e0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
339f0 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
33a00 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
33a10 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
33a20 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
33a30 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
33a40 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
33a50 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
33a60 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
33a70 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
33a80 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
33a90 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
33aa0 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
33ab0 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
33ac0 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
33ad0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
33ae0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
33af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33b00 50 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65  PagerGet(.  Page
33b10 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33b20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33b30 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33b40 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
33b50 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
33b60 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
33b70 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
33b80 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
33b90 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33ba0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33bb0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33bc0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33bd0 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33be0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33c00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33c10 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
33c20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33c30 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
33c40 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
33c50 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
33c60 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
33c70 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
33c80 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
33c90 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
33ca0 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33cb0 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33cc0 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33cd0 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33ce0 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33cf0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33d00 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33d10 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33d20 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33d30 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33d40 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
33d50 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
33d60 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
33d70 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
33d80 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
33d90 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
33da0 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31  MmapOk = (pgno>1
33db0 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33dc0 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33dd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33de0 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33df0 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
33e00 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
33e10 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
33e20 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
33e30 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
33e40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74 69  .  );..  /* Opti
33e50 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
33e60 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
33e70 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
33e80 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
33e90 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
33ea0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
33eb0 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
33ec0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
33ed0 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
33ee0 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
33ef0 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
33f00 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
33f10 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
33f20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
33f30 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
33f40 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
33f50 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
33f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33f70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33f80 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
33f90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33fa0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33fb0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
33fc0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33fd0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
33fe0 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
33ff0 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
34000 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
34010 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
34020 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 2f  dLock==1 );..  /
34030 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
34040 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
34050 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
34060 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
34070 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
34080 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
34090 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
340a0 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
340b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
340c0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
340d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
340e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
340f0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d  else{.    if( bM
34100 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
34110 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
34120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34130 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
34140 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
34150 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
34160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34170 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34180 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34190 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d     }..    if( bM
341a0 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d  mapOk && iFrame=
341b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  =0 ){.      void
341c0 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20   *pData = 0;..  
341d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
341e0 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
341f0 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  fd, .          (
34200 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
34210 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34220 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34230 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20  e, &pData.      
34240 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
34250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
34260 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
34270 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
34280 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
34290 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
342a0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
342b0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
342c0 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
342d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
342e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
342f0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
34300 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
34310 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
34320 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
34330 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
34340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34350 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
34360 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
34370 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67  64)(pgno-1)*pPag
34380 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
34390 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata);.        }.
343a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20          if( pPg 
343b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
343c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
343d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OK );.          
343e0 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
343f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
34410 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34420 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34440 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34450 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34460 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20      }..    {.   
34470 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68     sqlite3_pcach
34480 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20  e_page *pBase;. 
34490 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c       pBase = sql
344a0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
344b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
344c0 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20   pgno, 3);.     
344d0 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
344e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
344f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34500 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
34510 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
34520 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Base);.        i
34530 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34540 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34550 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34560 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
34570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34580 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a   = *ppPage = 0;.
34590 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
345a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
345b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
345c0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
345d0 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rr;.        }.  
345e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
345f0 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
34600 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
34610 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
34620 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
34630 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
34640 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20  ( pPg!=0 );.    
34650 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
34660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34670 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
34680 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
34690 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
346a0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
346b0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
346c0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
346d0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
346e0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
346f0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
34700 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
34710 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
34720 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
34730 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
34740 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
34750 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34760 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
34770 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65  t( pPg==(*ppPage
34780 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34790 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
347a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
347b0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
347c0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
347d0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  0 );..  if( pPg-
347e0 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
347f0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
34800 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34810 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
34820 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
34830 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
34840 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
34850 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
34860 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
34870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
34880 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
34890 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
348a0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
348b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
348c0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
348d0 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
348e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
348f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
34900 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
34910 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
34920 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
34930 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
34940 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
34950 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50  zed.  */..    pP
34960 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
34970 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
34980 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
34990 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
349a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
349b0 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
349c0 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
349d0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
349e0 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
349f0 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
34a00 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
34a10 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
34a20 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
34a30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34a40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
34a50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34a60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
34a70 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34a80 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
34a90 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
34aa0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
34ab0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 69   !MEMDB );.    i
34ac0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
34ad0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
34ae0 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
34af0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
34b00 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
34b10 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
34b20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34b30 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
34b40 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34b50 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34b60 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
34b70 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
34b80 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
34b90 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
34ba0 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
34bb0 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
34bc0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
34bd0 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
34be0 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
34bf0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
34c00 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
34c10 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
34c20 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
34c30 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
34c40 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
34c50 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
34c60 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
34c70 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
34c80 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
34c90 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
34ca0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
34cb0 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
34cc0 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
34cd0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
34ce0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
34cf0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
34d00 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
34d10 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
34d20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
34d30 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
34d40 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
34d50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
34d60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
34d70 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
34d80 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
34d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34da0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
34db0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
34dc0 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
34dd0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
34de0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
34df0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
34e00 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
34e10 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
34e20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
34e30 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
34e40 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34e50 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
34e60 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
34e70 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
34e80 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
34e90 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
34ea0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
34eb0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20  bMmapOk==0 ){.  
34ec0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34ed0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
34ee0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
34ef0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
34f00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34f10 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
34f20 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34f40 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
34f50 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
34f60 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
34f70 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
34f80 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
34f90 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
34fa0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
34fb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34fc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
34fd0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34fe0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34ff0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
35000 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
35010 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
35020 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
35030 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
35040 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35050 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
35060 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
35070 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
35080 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
35090 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
350a0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
350b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
350c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
350d0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
350e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
350f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
35100 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
35110 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
35120 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
35130 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35140 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
35150 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
35160 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
35170 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
35180 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
35190 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
351a0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
351b0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
351c0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
351d0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
351e0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
351f0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
35200 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
35210 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
35220 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
35230 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
35240 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
35250 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
35260 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
35270 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
35280 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
35290 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
352a0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
352b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
352c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71  Pgno pgno){.  sq
352d0 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
352e0 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
352f0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
35300 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
35310 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
35320 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
35330 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
35340 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35350 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
35360 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  he, pgno, 0);.  
35370 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30  assert( pPage==0
35380 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48   || pPager->hasH
35390 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b  eldSharedLock );
353a0 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
353b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
353c0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
353d0 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
353e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
353f0 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a  gno, pPage);.}..
35400 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
35410 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
35420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
35430 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
35440 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
35450 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
35460 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
35470 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
35480 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
35490 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
354a0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
354b0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
354c0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
354d0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
354e0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
354f0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
35500 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35510 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
35520 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
35530 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
35540 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
35550 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35560 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
35570 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
35580 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
35590 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
355a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
355b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
355c0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
355d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
355e0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
355f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35600 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
35610 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
35620 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35630 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
35640 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
35650 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35660 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
35670 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
35680 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
35690 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
356a0 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
356b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
356c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
356d0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
356e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
356f0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
35700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35710 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
35720 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
35730 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
35740 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35750 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
35760 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
35770 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
35780 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
35790 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
357a0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
357b0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
357c0 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
357d0 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
357e0 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
357f0 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
35800 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
35810 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
35820 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
35830 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
35840 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
35850 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
35860 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
35870 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
35880 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
35890 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
358a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
358b0 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
358c0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
358d0 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
358e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
358f0 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
35900 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
35910 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
35920 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
35930 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
35940 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
35950 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
35960 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
35970 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
35980 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
35990 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
359a0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
359b0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
359c0 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
359d0 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
359e0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
359f0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
35a00 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
35a10 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
35a20 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
35a30 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
35a40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35a50 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
35a60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35a70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35a80 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
35a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35aa0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
35ab0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
35ac0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
35ad0 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
35ae0 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
35af0 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
35b00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35b10 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35b20 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
35b30 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35b40 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
35b50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35b60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35b70 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
35b80 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
35b90 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
35ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35bb0 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
35bc0 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
35bd0 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
35be0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
35bf0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
35c00 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
35c10 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
35c20 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
35c30 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
35c40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
35c50 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
35c60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35c70 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
35c80 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
35c90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
35ca0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
35cb0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
35cc0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
35cd0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
35ce0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
35cf0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
35d00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
35d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
35d20 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
35d30 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
35d40 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
35d50 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
35d60 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
35d70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35d80 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
35d90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35da0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
35db0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
35dc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35dd0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
35de0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
35df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35e00 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
35e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
35e20 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
35e30 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20  _CREATE;.       
35e40 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20   int nSpill;..  
35e50 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
35e60 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
35e70 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
35e80 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
35e90 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
35ea0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
35eb0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  RNAL);.         
35ec0 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65   nSpill = sqlite
35ed0 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
35ee0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
35ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  e{.          fla
35f00 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
35f10 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
35f20 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
35f30 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a   = jrnlBufferSiz
35f40 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
35f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
35f60 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
35f70 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
35f80 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
35f90 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
35fa0 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
35fb0 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
35fc0 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
35fd0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
35fe0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
35ff0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
36000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
36030 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20  urnalOpen (.    
36040 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
36050 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
36060 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
36070 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20  lags, nSpill.   
36080 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
36090 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
360a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
360b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
360c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
360d0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
360e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
360f0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
36100 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
36110 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
36120 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
36130 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
36140 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
36150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
36170 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
36180 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
36190 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
361a0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
361b0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
361c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
361d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
361e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
361f0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
36200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
36210 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
36220 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
36230 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
36240 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
36250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
36260 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
36270 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
36280 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
36290 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
362a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
362b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
362c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
362d0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
362e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
362f0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
36300 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
36310 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
36320 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
36330 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36340 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
36350 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
36360 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
36370 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
36380 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
36390 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
363a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
363b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
363c0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
363d0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
363e0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
363f0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
36400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36410 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
36420 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
36430 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
36440 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36450 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
36460 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
36470 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
36480 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
36490 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
364a0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
364b0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
364c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
364d0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
364e0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
364f0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
36500 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
36510 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
36520 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
36530 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
36540 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
36550 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
36560 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
36570 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
36580 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
36590 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
365a0 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
365b0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
365c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
365d0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
365e0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
365f0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
36600 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
36610 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
36620 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
36630 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
36640 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36650 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
36660 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
36670 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
36680 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
36690 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
366a0 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
366b0 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
366c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
366d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
366e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
366f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36700 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
36710 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36720 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
36730 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
36740 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
36750 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
36760 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
36770 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
36780 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
36790 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
367a0 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
367b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
367c0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
367d0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
367e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
367f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36800 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
36810 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
36820 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
36830 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
36840 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
36850 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36860 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
36870 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
36880 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
36890 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
368a0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
368b0 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
368c0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
368d0 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
368e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
368f0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
36900 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
36910 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
36920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36930 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36940 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
36950 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
36960 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
36970 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
36980 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
36990 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
369a0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
369b0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
369c0 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
369d0 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
369e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
369f0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
36a00 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
36a10 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
36a20 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
36a30 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
36a40 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
36a50 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
36a60 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
36a70 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
36a80 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
36a90 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
36aa0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
36ab0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
36ac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36ad0 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
36ae0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
36af0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
36b00 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
36b10 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
36b20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36b30 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
36b40 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
36b50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
36b60 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
36b70 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
36b80 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
36b90 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
36ba0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
36bb0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
36bc0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
36bd0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
36be0 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
36bf0 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
36c00 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
36c10 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
36c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
36c30 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
36c40 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
36c50 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
36c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36c70 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
36c80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
36c90 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
36ca0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36cb0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
36cc0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
36cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36ce0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
36cf0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
36d00 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
36d10 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
36d20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
36d30 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
36d40 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
36d50 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
36d60 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
36d70 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
36d80 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
36d90 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
36da0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
36db0 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
36dc0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
36dd0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
36de0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
36df0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
36e00 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
36e10 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
36e20 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
36e30 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
36e40 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
36e50 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
36e60 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
36e70 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
36e80 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36e90 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
36ea0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
36eb0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
36ec0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
36ed0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
36ee0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36ef0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
36f00 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
36f10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36f20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
36f30 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
36f40 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36f50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36f60 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
36f70 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36f80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
36f90 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36fa0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
36fb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
36fc0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
36fd0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36fe0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
36ff0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
37000 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37010 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
37020 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
37030 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
37040 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
37050 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
37060 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70  }../*.** Write p
37070 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65  age pPg onto the
37080 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c   end of the roll
37090 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
370a0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
370b0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
370c0 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
370d0 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  ckJournal(PgHdr 
370e0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
370f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37100 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
37110 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63    u32 cksum;.  c
37120 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69  har *pData2;.  i
37130 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
37140 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
37150 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
37160 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
37170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
37180 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a  e page that.  **
37190 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
371a0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
371b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
371c0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a  ert verifies.  *
371d0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
371e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
371f0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
37200 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
37210 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
37220 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
37230 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
37240 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32  lOff );.  CODEC2
37250 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
37260 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
37270 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
37280 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
37290 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20  ta2);.  cksum = 
372a0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
372b0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
372c0 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20  ;..  /* Even if 
372d0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
372e0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
372f0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
37300 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
37310 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
37320 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
37330 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
37340 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68  e page..  ** Oth
37350 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
37360 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
37370 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
37380 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70   logic in.  ** p
37390 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
373a0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
373b0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
373c0 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
373d0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  .  ** in the dat
373e0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
373f0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
37400 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
37410 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  g so,.  ** then 
37420 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
37430 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  ollow..  */.  pP
37440 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
37450 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
37460 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
37470 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
37480 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
37490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
374a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
374b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
374c0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
374d0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
374e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
374f0 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  ff+4);.  if( rc!
37500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37510 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77  urn rc;.  rc = w
37520 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
37530 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
37540 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
37550 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72   cksum);.  if( r
37560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
37570 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54  eturn rc;..  IOT
37580 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
37590 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
375a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
375b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61   .           pPa
375c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
375d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
375e0 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  e));.  PAGER_INC
375f0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
37600 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
37610 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
37620 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
37630 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
37640 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
37650 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
37660 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
37670 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37680 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37690 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
376a0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
376b0 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
376c0 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
376d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
376e0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b  .  pPager->nRec+
376f0 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  +;.  assert( pPa
37700 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37710 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
37720 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
37730 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37740 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37750 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
37760 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37770 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37780 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
37790 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
377a0 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
377b0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
377c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
377d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
377e0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
377f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37800 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37810 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
37820 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
37830 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
37840 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
37850 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
37860 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
37870 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
37880 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
37890 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
378a0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
378b0 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
378c0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
378d0 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
378e0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
378f0 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
37900 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
37910 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
37920 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
37930 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
37940 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
37950 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
37960 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
37970 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
37980 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
37990 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
379a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
379b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
379c0 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
379d0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
379e0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
379f0 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
37a00 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
37a10 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
37a20 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
37a30 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
37a40 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
37a50 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
37a60 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
37a70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37a80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37a90 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
37aa0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37ab0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37ac0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
37ad0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37ae0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37af0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
37b00 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37b10 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37b20 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
37b30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
37b40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
37b50 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
37b60 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50  ==0 );.  CHECK_P
37b70 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
37b80 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
37b90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
37ba0 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
37bb0 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
37bc0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
37bd0 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
37be0 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
37bf0 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
37c00 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
37c10 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
37c20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
37c30 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
37c40 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
37c50 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
37c60 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
37c70 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
37c80 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
37c90 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
37ca0 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
37cb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
37cc0 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
37cd0 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
37ce0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
37cf0 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
37d00 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
37d10 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
37d20 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
37d30 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
37d40 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
37d50 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
37d60 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
37d70 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
37d80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37d90 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37da0 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
37db0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
37dc0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
37dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37de0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37df0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
37e00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
37e10 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37e20 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
37e30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37e40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
37e50 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
37e60 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74   that is about t
37e70 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
37e80 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c   dirty. */.  sql
37e90 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37ea0 72 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  rty(pPg);..  /* 
37eb0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  If a rollback jo
37ec0 75 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c  urnal is in use,
37ed0 20 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20   them make sure 
37ee0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
37ef0 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63   about.  ** to c
37f00 68 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20  hange is in the 
37f10 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37f20 2c 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  , or if the page
37f30 20 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f   is a new page o
37f40 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64  ff.  ** then end
37f50 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61   of the file, ma
37f60 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61  ke sure it is ma
37f70 72 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45  rked as PGHDR_NE
37f80 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20  ED_SYNC..  */.  
37f90 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
37fa0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20  >pInJournal!=0) 
37fb0 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  == isOpen(pPager
37fc0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
37fd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37fe0 61 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69  al!=0.   && sqli
37ff0 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74  te3BitvecTestNot
38000 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e  Null(pPager->pIn
38010 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
38020 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  no)==0.  ){.    
38030 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
38040 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
38050 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
38060 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
38070 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
38080 20 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61   rc = pagerAddPa
38090 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72  geToRollbackJour
380a0 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20  nal(pPg);.      
380b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
380c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
380d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
380e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
380f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
38100 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
38110 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
38120 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
38130 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
38140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38150 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
38160 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
38170 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
38180 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
38190 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
381a0 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
381b0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
381c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
381d0 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
381e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
381f0 50 47 48 44 52 5f 44 49 52 54 59 20 62 69 74 20  PGHDR_DIRTY bit 
38200 69 73 20 73 65 74 20 61 62 6f 76 65 20 77 68 65  is set above whe
38210 6e 20 74 68 65 20 70 61 67 65 20 77 61 73 20 61  n the page was a
38220 64 64 65 64 20 74 6f 20 74 68 65 20 64 69 72 74  dded to the dirt
38230 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20  y-list.  ** and 
38240 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
38250 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
38260 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
38270 6c 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20 6e  l.  Wait until n
38280 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20 74  ow,.  ** after t
38290 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
382a0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f   successfully jo
382b0 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65  urnalled, before
382c0 20 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20 2a   setting the.  *
382d0 2a 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c  * PGHDR_WRITEABL
382e0 45 20 62 69 74 20 74 68 61 74 20 69 6e 64 69 63  E bit that indic
382f0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61  ates that the pa
38300 67 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  ge can be safely
38310 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
38320 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
38330 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 3b  PGHDR_WRITEABLE;
38340 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
38350 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
38360 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
38370 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
38380 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77   it,.  ** then w
38390 72 69 74 65 20 74 68 65 20 70 61 67 65 20 69 6e  rite the page in
383a0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
383b0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
383c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61   if( pPager->nSa
383d0 76 65 70 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20  vepoint>0 ){.   
383e0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
383f0 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
38400 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  Pg);.  }..  /* U
38410 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
38420 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
38430 72 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  rn. */.  if( pPa
38440 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
38450 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
38460 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
38470 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
38480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
38490 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 61 72  ** This is a var
384a0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 50  iant of sqlite3P
384b0 61 67 65 72 57 72 69 74 65 28 29 20 74 68 61 74  agerWrite() that
384c0 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 73   runs when the s
384d0 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73  ector size.** is
384e0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
384f0 20 70 61 67 65 20 73 69 7a 65 2e 20 20 53 51 4c   page size.  SQL
38500 69 74 65 20 6d 61 6b 65 73 20 74 68 65 20 28 72  ite makes the (r
38510 65 61 73 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d  easonable) assum
38520 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c  ption that.** al
38530 6c 20 62 79 74 65 73 20 6f 66 20 61 20 73 65 63  l bytes of a sec
38540 74 6f 72 20 61 72 65 20 77 72 69 74 74 65 6e 20  tor are written 
38550 74 6f 67 65 74 68 65 72 20 62 79 20 68 61 72 64  together by hard
38560 77 61 72 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c  ware.  Hence, al
38570 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20  l bytes of.** a 
38580 73 65 63 74 6f 72 20 6e 65 65 64 20 74 6f 20 62  sector need to b
38590 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20  e journalled in 
385a0 63 61 73 65 20 6f 66 20 61 20 70 6f 77 65 72 20  case of a power 
385b0 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d 69 64 64  loss in the midd
385c0 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65  le of.** a write
385d0 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c  ..**.** Usually,
385e0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
385f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
38600 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 61   equal to the pa
38610 67 65 20 73 69 7a 65 2c 20 69 6e 20 77 68 69 63  ge size, in whic
38620 68 0a 2a 2a 20 63 61 73 65 20 70 61 67 65 73 20  h.** case pages 
38630 63 61 6e 20 62 65 20 69 6e 64 69 76 69 64 75 61  can be individua
38640 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20 20 54 68  lly written.  Th
38650 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
38660 72 75 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65  runs in the.** e
38670 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20  xceptional case 
38680 77 68 65 72 65 20 74 68 65 20 70 61 67 65 20 73  where the page s
38690 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ize is smaller t
386a0 68 61 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  han the sector s
386b0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ize..*/.static S
386c0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
386d0 6e 74 20 70 61 67 65 72 57 72