/ Hex Artifact Content
Login

Artifact 97a8908bf4e6e7c3adea09d3597cfa48ae33ab4e:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 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 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
7420: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
7430: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
7440: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
7450: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
7460: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7470: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7480: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7490: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
74f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7500: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
7510: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7520: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
7530: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
7540: 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73  opertion.  Class
7550: 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20   members not in 
7560: 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 65  this block are e
7570: 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a 2a  ither fixed.  **
7580: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
7590: 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65 64  is first created
75a0: 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68   or else only ch
75b0: 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65 20  ange when there 
75c0: 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66  is a.  ** signif
75d0: 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67  icant mode chang
75e0: 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e 67  e (such as chang
75f0: 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69 7a  ing the page_siz
7600: 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c  e, locking_mode,
7610: 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75  .  ** or the jou
7620: 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f  rnal_mode).  Fro
7630: 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c 20  m another view, 
7640: 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  these class memb
7650: 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20 2a  ers describe.  *
7660: 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f 66  * the "state" of
7670: 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69 6c   the pager, whil
7680: 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d 65  e other class me
7690: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20 74  mbers describe t
76a0: 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75  he.  ** "configu
76b0: 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20 70  ration" of the p
76c0: 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20  ager..  */.  u8 
76d0: 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
76e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
76f0: 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20 52  r state (OPEN, R
7700: 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f  EADER, WRITER_LO
7710: 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20  CKED..) */.  u8 
7720: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
7730: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7740: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7760: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
7770: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
7780: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
7790: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
77a0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
77b0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77d0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
77e0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
77f0: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
7800: 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b    u8 doNotSpill;
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7820: 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   Do not spill th
7830: 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e  e cache when non
7840: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73 75  -zero */.  u8 su
7850: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
7860: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7870: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
7880: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
7890: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
78c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
78d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
78e0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
78f0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7900: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7910: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7920: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7940: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7960: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7970: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7980: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7990: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
79a0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
79b0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79d0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
79e0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
79f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7a20: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7a30: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7a40: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7a50: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7a60: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7a70: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7a80: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7a90: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ab0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7ac0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7ad0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7ae0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7af0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7b00: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7b10: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7b20: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7b30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7b40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7b50: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7b60: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7b70: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7b80: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7b90: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ba0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7bb0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7bc0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7bd0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7be0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7bf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7c00: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7c10: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7c20: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7c30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7c40: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7c50: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7c60: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7c70: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7c90: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ca0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7cb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7cc0: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7cd0: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7ce0: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7cf0: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7d00: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7d10: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7d20: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d40: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7d50: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7d60: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7d70: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7d80: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7d90: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7da0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7db0: 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  /..  u8 bUseFetc
7dc0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7dd0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7de0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69 6e  xFetch() */.  in
7df0: 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20  t nMmapOut;     
7e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e10: 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65  ber of mmap page
7e20: 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73  s currently outs
7e30: 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c  tanding */.  sql
7e40: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
7e50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69  p;       /* Desi
7e60: 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70  red maximum mmap
7e70: 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72   size */.  PgHdr
7e80: 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b   *pMmapFreelist;
7e90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
7ea0: 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65  f free mmap page
7eb0: 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74 79   headers (pDirty
7ec0: 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ) */.  /*.  ** E
7ed0: 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e  nd of the routin
7ee0: 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61  ely-changing cla
7ef0: 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a  ss members.  ***
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36  ********/..  u16
7f50: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
7f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
7f70: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
7f80: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
7f90: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20  y page */.  i16 
7fa0: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7fc0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7fd0: 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68  s at end of each
7fe0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
7ff0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
8000: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8010: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
8020: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32  xOpen() */.  u32
8030: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
8040: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
8050: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
8060: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
8070: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
8080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8090: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
80a0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
80b0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80d0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
80e0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
80f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20  tabase */.  i64 
8100: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
8110: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
8120: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
8130: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
8140: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
8150: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
8160: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8180: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
8190: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
81a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
81b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
81c0: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
81d0: 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f  ndler)(void*); /
81e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
81f0: 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a  ll when busy */.
8200: 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
8210: 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a  dlerArg;      /*
8220: 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e   Context argumen
8230: 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c  t for xBusyHandl
8240: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61  er */.  int aSta
8250: 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  t[3];           
8260: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63      /* Total cac
8270: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20  he hits, misses 
8280: 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69  and writes */.#i
8290: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
82a0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
82c0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
82d0: 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
82e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
82f0: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
8300: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
8310: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
8320: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
8330: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
8340: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
8350: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
8360: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
8370: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
8380: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
8390: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
83a0: 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
83b0: 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66  t,int); /* Notif
83c0: 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63  y of page size c
83d0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64  hanges */.  void
83e0: 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
83f0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20  oid*);          
8400: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
8410: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a   for the codec *
8420: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
8430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8440: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
8450: 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d  t to xCodec... m
8460: 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66  ethods */.#endif
8470: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
8480: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
8490: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
84a0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
84b0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
84c0: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
84d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
84e0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
84f0: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70  MIT_WAL.  Wal *p
8520: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8530: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61        /* Write-a
8540: 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79  head log used by
8550: 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77   "journal_mode=w
8560: 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  al" */.  char *z
8570: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8580: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
8590: 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61  e for write-ahea
85a0: 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  d log */.#endif.
85b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65  };../*.** Indexe
85c0: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 50  s for use with P
85d0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68  ager.aStat[]. Th
85e0: 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20  e Pager.aStat[] 
85f0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  array contains.*
8600: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63 63  * the values acc
8610: 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e 67  essed by passing
8620: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8630: 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48  _CACHE_HIT, CACH
8640: 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41  E_MISS .** or CA
8650: 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c  CHE_WRITE to sql
8660: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29  ite3_db_status()
8670: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8680: 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a  ER_STAT_HIT   0.
8690: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
86a0: 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69  AT_MISS  1.#defi
86b0: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52  ne PAGER_STAT_WR
86c0: 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ITE 2../*.** The
86d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
86e0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
86f0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
8700: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
8710: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
8720: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
8730: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
8740: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
8750: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
8760: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
8770: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
8780: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8790: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
87a0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
87b0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
87c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
87d0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
87e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
87f0: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
8800: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
8810: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8820: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
8830: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8840: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
8850: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8860: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
8870: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
8880: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8890: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
88a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
88b0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
88c0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
88d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
88e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
88f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
8900: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
8910: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
8920: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
8930: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
8940: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
8950: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
8960: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
8970: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8980: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
8990: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
89a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
89b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
89c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
89d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
89e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
89f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
8a00: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
8a10: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
8a20: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
8a30: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
8a40: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
8a50: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
8a60: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
8a70: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
8a80: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
8a90: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
8aa0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
8ab0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
8ac0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
8ad0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
8ae0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
8af0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
8b00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
8b10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
8b20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8b30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
8b40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
8b50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
8b60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
8b70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
8b80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
8b90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
8ba0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8bb0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
8bc0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8bd0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
8be0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
8bf0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
8c00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
8c10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
8c20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
8c30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
8c40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
8c50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
8c60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
8c70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
8c80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
8c90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
8ca0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
8cb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
8cc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
8cd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
8ce0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
8cf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
8d00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
8d10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
8d20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
8d30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
8d40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
8d50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
8d60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
8d70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
8d80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
8d90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
8da0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
8db0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
8dc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
8dd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
8de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8df0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
8e00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
8e10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
8e20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
8e30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
8e40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
8e50: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
8e60: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
8e70: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
8e80: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
8e90: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
8ea0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
8eb0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
8ec0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8ed0: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
8ee0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ef0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
8f00: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
8f10: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
8f20: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
8f30: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
8f40: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
8f50: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
8f60: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
8f70: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
8f80: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
8f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
8fa0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
8fb0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
8fc0: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
8fd0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
8fe0: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
8ff0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
9000: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
9010: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
9020: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
9030: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
9040: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
9050: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
9060: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
9070: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
9080: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
9090: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
90a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
90b0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
90c0: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
90d0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
90e0: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
90f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
9100: 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74 72  o USEFETCH is tr
9110: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c  ue if we are all
9120: 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  owed to use the 
9130: 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65  xFetch and xUnfe
9140: 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  tch.** interface
9150: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9160: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d  database using m
9170: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
9180: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9190: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
91a0: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
91b0: 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46  H(x) ((x)->bUseF
91c0: 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65  etch).#else.# de
91d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
91e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
91f0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
9200: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
9210: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
9220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
9230: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
9240: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
9250: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
9260: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
9270: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
9280: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
9290: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
92a0: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
92b0: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
92c0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
92d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
92e0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
92f0: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
9300: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
9310: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9320: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
9330: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
9340: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
9350: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
9360: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
9370: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
9380: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
9390: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
93a0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
93b0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
93c0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
93d0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
93e0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
93f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9400: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9410: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9430: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9440: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9450: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9460: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9470: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9480: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9490: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
94a0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
94b0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
94c0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
94d0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
94e0: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
94f0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9500: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9510: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9520: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9530: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9540: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9550: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9560: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9570: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
9580: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
9590: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
95a0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
95b0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
95c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
95d0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
95e0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
95f0: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9600: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9610: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9620: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9630: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9640: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9650: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9660: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9670: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9680: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
9690: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96a0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
96b0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
96c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
96d0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
96e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
96f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9700: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9720: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9730: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9740: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9750: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9760: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9770: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9780: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9790: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
97a0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
97b0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
97c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
97d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
97e0: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
97f0: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9800: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9810: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9820: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9830: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9840: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9850: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9860: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9870: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9880: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9890: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
98a0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
98b0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
98c0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
98d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
98e0: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
98f0: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9900: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9910: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9920: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9930: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9950: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9960: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9970: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9980: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9990: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
99a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99b0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
99c0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
99d0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
99e0: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
99f0: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9a00: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9a10: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9a20: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9a30: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9a40: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9a50: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9a60: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9a70: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9a80: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9a90: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9aa0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9ab0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9ac0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9ad0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9ae0: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9af0: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9b10: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9b20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9b30: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9b40: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9b50: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9b60: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9b70: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9b80: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9b90: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ba0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9bc0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9bd0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9be0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9bf0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9c00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9c10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c20: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c30: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9c40: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9c50: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9c60: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9c70: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9c80: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9c90: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9ca0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9cb0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9cc0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9cd0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
9ce0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
9cf0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
9d00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9d10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9d20: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9d30: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9d40: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9d50: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9d60: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9d70: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9d80: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9d90: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9da0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9db0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9dc0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9dd0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9df0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9e00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9e10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9e20: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9e30: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9e40: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9e70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e80: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9e90: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9ea0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9eb0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9ec0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
9ed0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9ee0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9ef0: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
9f00: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9f10: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9f50: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9f60: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9f70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f80: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9f90: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
9fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9fb0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
9fc0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
9fd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9fe0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9ff0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a000: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a010: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a020: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a030: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a040: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a050: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a060: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a070: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a080: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a090: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a0a0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a0b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a0e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a0f0: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a100: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a110: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a120: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a130: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a140: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a150: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a160: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a170: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a180: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a190: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a1a0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a1b0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a1c0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a1d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a1e0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a1f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a200: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a210: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a220: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a230: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a240: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a250: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a260: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a270: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a280: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a2a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a2b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a2c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a2e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2f0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a300: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a320: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a330: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a340: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a350: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a360: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a370: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a380: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a390: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3b0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a3c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a3d0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a3e0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a400: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a410: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a420: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a430: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a440: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a450: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a460: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a470: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a480: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a490: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a4a0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a4b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4c0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a4d0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a4e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a4f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a500: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a510: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a520: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a530: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a540: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a550: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a560: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a570: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a580: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a5a0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a5b0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a5c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a5d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a5e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a5f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a600: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a610: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a620: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a630: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a640: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a650: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a660: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a670: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a680: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a690: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a6a0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a6b0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a6c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a6d0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a6e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a6f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a710: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a720: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a730: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a740: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a750: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a770: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a780: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
a790: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
a7a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7b0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
a7c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a7d0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a7e0: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a7f0: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a800: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a810: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a820: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a830: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a840: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a850: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a860: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a870: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a880: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a890: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a8a0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a8b0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a8c0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a8d0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a8e0: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a8f0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
a900: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
a910: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
a920: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
a930: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
a940: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
a950: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
a960: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
a970: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
a980: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
a990: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
a9a0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
a9b0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
a9c0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a9d0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
a9e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
aa00: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
aa10: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
aa20: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
aa30: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
aa40: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
aa50: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
aa60: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
aa70: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
aa80: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
aa90: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
aaa0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
aab0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
aac0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
aad0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
aae0: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
aaf0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ab00: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ab10: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ab20: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ab30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ab40: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ab50: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ab60: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ab70: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ab80: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
ab90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aba0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
abc0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
abd0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
abe0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
abf0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
ac00: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
ac10: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
ac20: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ac30: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
ac40: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
ac50: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
ac60: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
ac70: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
ac80: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
ac90: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
aca0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acb0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
acc0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
acd0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ace0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
acf0: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
ad00: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
ad10: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
ad20: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
ad30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ad40: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
ad50: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
ad60: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
ad70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
ad80: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
ad90: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
ada0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
adb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
adc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
add0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
ade0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
adf0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ae00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ae10: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
ae20: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae40: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
ae50: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
ae60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae80: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
ae90: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
aea0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aeb0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aec0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
aed0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
aee0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aef0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
af10: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
af20: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
af30: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
af40: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
af50: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
af60: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
af70: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
af80: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
af90: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
afa0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
afb0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
afc0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
afd0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
afe0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
aff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b000: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b010: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b020: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b030: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b040: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b050: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b060: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b070: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b080: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b090: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b0a0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b0b0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b0c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b0d0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b0e0: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b0f0: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b100: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b110: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b120: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b130: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b140: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b160: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b170: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b180: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b190: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b1a0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b1b0: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
b1c0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
b1d0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b1e0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b1f0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
b200: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b210: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b220: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b230: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b240: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
b250: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
b260: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b270: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b280: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b290: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b2a0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
b2b0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
b2c0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
b2d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
b2e0: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
b2f0: 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
b300: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
b310: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
b320: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
b330: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
b340: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
b350: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
b360: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
b370: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
b380: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
b390: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
b3a0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
b3b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
b3c0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
b3d0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
b3e0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
b3f0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
b400: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
b410: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
b420: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
b430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b440: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
b450: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
b460: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
b470: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
b480: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
b490: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
b4a0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
b4b0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
b4c0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
b4d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
b4e0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b4f0: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b500: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b510: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b520: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b530: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b540: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b550: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b560: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b570: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b580: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b590: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b5a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b5b0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b5c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b5d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b5e0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b5f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b600: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b610: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b620: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b630: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b640: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b650: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b660: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b670: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b680: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b690: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b6a0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b6b0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b6c0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b6d0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b6e0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b6f0: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b700: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b710: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b720: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b730: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b740: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b750: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b760: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b770: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b780: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b790: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b7a0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b7b0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b7c0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b7d0: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b7e0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b7f0: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b800: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b810: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b820: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b830: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b840: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b850: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b860: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b870: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b880: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b890: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b8a0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b8b0: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
b8c0: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
b8d0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b8e0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
b8f0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
b900: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b910: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
b920: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
b930: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
b940: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
b950: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b960: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
b970: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
b980: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
b990: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
b9a0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
b9b0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
b9c0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
b9d0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
b9e0: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
b9f0: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
ba00: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
ba10: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
ba20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ba30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
ba40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ba50: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
ba60: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
ba70: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
ba80: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
ba90: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
baa0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bab0: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bac0: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bad0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bae0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
baf0: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bb00: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bb10: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bb20: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bb30: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bb40: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bb50: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bb60: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bb70: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bb80: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bb90: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bba0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bbb0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bbc0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bbd0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bbe0: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bbf0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bc00: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bc10: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bc20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bc30: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bc40: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bc50: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bc60: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
bc70: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
bc80: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
bc90: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
bca0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
bcb0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
bcc0: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  CK ){.    rc = s
bcd0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
bce0: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
bcf0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
bd00: 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65  ITE_OK && (pPage
bd10: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
bd20: 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45  N_LOCK||eLock==E
bd30: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29  XCLUSIVE_LOCK) )
bd40: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bd50: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bd60: 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
bd70: 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
bd80: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
bd90: 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
bda0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bdb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bdc0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
bdd0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
bde0: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
bdf0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
be00: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
be10: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
be20: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
be30: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
be40: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
be50: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
be60: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
be70: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
be80: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
be90: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
bea0: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
beb0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
bec0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
bed0: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
bee0: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
bef0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
bf00: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
bf10: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
bf20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
bf30: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
bf40: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
bf50: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
bf60: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
bf70: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
bf80: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
bf90: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
bfa0: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
bfb0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
bfc0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
bfd0: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
bfe0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
bff0: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
c000: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
c010: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
c020: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c030: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
c040: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
c050: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c060: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c070: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
c080: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c090: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
c0a0: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
c0b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c0c0: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
c0d0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
c0e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
c0f0: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
c120: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
c130: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
c140: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
c150: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
c160: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
c170: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
c1a0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
c1b0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c1c0: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
c1d0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
c1e0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
c1f0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
c200: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
c210: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
c220: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
c230: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
c240: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c250: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
c260: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
c270: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
c280: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
c290: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
c2a0: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
c2b0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
c2c0: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
c2d0: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
c2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
c2f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
c300: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
c310: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
c320: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
c330: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
c340: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c350: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c360: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c370: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c380: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c390: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c3a0: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c3b0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c3c0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c3d0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c3e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c3f0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c400: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c410: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c420: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c430: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c440: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c450: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c460: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c470: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c480: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c490: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c4a0: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c4b0: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c4c0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c4d0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c4e0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c4f0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c500: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c510: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c520: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c530: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c540: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c550: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c560: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c570: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c580: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c590: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c5a0: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c5b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c5c0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c5d0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c5e0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c5f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c600: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c610: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c620: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c630: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c640: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c650: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c660: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c670: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c680: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c690: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c6a0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c6b0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c6c0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c6d0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c6e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c6f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c700: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c710: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c720: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c730: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c740: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c750: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c760: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c770: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c780: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c790: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c7a0: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c7b0: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c7c0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c7d0: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c7e0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c7f0: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c800: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c810: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
c820: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
c830: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
c840: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
c850: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
c860: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
c870: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
c880: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c890: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
c8a0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
c8b0: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
c8c0: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
c8d0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
c8e0: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
c8f0: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
c900: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
c910: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
c920: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
c930: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
c940: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c950: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
c960: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
c970: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
c980: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
c990: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
c9a0: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
c9b0: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
c9c0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
c9d0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
c9e0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
c9f0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
ca00: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
ca10: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
ca20: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
ca30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ca40: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
ca50: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
ca60: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
ca70: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
ca80: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
ca90: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
caa0: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cab0: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cac0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
cad0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
cae0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
caf0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cb00: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
cb10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cb20: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cb30: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cb40: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cb50: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cb60: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
cb70: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
cb80: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
cb90: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
cba0: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
cbb0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
cbc0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
cbd0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
cbe0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
cbf0: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
cc00: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cc10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cc20: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
cc30: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
cc40: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
cc50: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
cc60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
cc70: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
cc80: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
cc90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
cca0: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
ccb0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
ccc0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ccd0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cce0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
ccf0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cd00: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cd10: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cd40: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
cd70: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
cd80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cd90: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdb0: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
cdc0: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
cdd0: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
cde0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
cdf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
ce00: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
ce10: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
ce20: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
ce50: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
ce60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
ce70: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
ce80: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
ce90: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
cea0: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
ceb0: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
cec0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
ced0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
cee0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
cef0: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
cf00: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cf10: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cf20: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
cf30: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
cf40: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
cf50: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
cf60: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cf70: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cf80: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
cf90: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cfa0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cfb0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
cfc0: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
cfd0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
cfe0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
cff0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d000: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d010: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d020: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d030: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d040: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d050: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d060: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d070: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d080: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d090: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d0a0: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d0b0: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d0c0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d0d0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d0e0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d0f0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d100: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d110: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d120: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d130: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d140: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d150: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d160: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d170: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d180: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d190: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d1a0: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d1b0: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d1c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d1d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d1e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d1f0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d200: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d210: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d220: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d230: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d240: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d250: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d260: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d270: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d280: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d290: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d2a0: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d2b0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d2c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d2d0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d2e0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d2f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d300: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d310: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d340: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d3b0: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d3c0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d3d0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d3e0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d3f0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d400: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d410: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d420: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d430: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d440: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d450: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d460: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d470: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d480: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d490: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d4a0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d4b0: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d4c0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d4d0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d4e0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d4f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d500: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d520: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d530: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d540: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d550: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d560: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d570: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d580: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d590: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d5a0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d5b0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d5c0: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d5d0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d5e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d5f0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d600: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d610: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d620: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d630: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d640: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d650: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d660: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d670: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d680: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d690: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d6a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d6b0: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d6c0: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d6d0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d6e0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d6f0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d700: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d710: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d720: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d730: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d740: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d750: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d760: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d770: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d780: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d790: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d7a0: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d7b0: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d7c0: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d7d0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d7e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d7f0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d800: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d820: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d830: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
d840: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
d850: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
d860: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
d870: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d880: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d890: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d8a0: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
d8b0: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d8c0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
d8d0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
d8e0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
d8f0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
d900: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
d910: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
d920: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
d930: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d940: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d970: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
d980: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
d990: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
d9a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d9b0: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
d9c0: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
d9d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
d9e0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
d9f0: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
da00: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
da10: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
da20: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
da30: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
da40: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
da50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
da60: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
da70: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
da80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
da90: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
daa0: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
dab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dac0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
dad0: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
dae0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
daf0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
db00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
db10: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
db20: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
db30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
db40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
db50: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
db60: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  LY|pPager->syncF
db70: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
db80: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
db90: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
dba0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
dbb0: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
dbc0: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
dbd0: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
dbe0: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
dbf0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
dc00: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
dc10: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
dc20: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
dc30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dc40: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
dc50: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
dc60: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
dc70: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
dc80: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
dc90: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
dca0: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
dcb0: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
dcc0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
dcd0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
dce0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dcf0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
dd00: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
dd10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dd20: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
dd30: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
dd40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
dd50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
dd60: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
dd70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
dd80: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
dd90: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
dda0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ddb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ddc0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
ddd0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
dde0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
ddf0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
de00: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
de10: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
de20: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
de30: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
de40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
de50: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
de60: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
de70: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
de80: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
de90: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
dea0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
deb0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
dec0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
ded0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
dee0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
def0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
df00: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
df10: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
df20: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
df30: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
df40: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
df50: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
df60: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
df70: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
df80: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
df90: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
dfa0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
dfb0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
dfc0: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
dfd0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
dfe0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
dff0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
e000: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
e010: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
e020: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
e030: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
e040: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
e050: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e070: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e080: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
e090: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
e0a0: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
e0b0: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
e0c0: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
e0d0: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
e0e0: 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
e0f0: 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f  geSize;/* Size o
e100: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
e110: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
e120: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e150: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
e160: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
e170: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e1a0: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
e1b0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e1c0: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
e1d0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
e1e0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
e1f0: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
e200: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e210: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
e220: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
e230: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
e240: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e250: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
e260: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
e270: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
e280: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
e290: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
e2a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
e2b0: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
e2c0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
e2d0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
e2e0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
e2f0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
e300: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
e310: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
e320: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
e330: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e340: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
e350: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
e360: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
e370: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
e380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
e390: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
e3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
e3b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e3c0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
e3d0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
e3e0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
e3f0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
e400: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
e410: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
e420: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
e430: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e440: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
e450: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
e460: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
e470: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
e480: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
e490: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
e4a0: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
e4b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
e4c0: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
e4d0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
e4e0: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
e4f0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
e500: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
e510: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
e520: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
e530: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
e540: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
e550: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
e560: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
e570: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
e580: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e590: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
e5a0: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
e5b0: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
e5c0: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
e5d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e5e0: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
e5f0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
e600: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
e610: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
e620: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
e630: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
e640: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
e650: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e660: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
e670: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
e680: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
e690: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
e6a0: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
e6b0: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
e6c0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e6d0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
e6e0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e6f0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
e700: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
e710: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
e720: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
e730: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
e740: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
e750: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e760: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
e770: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
e780: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
e790: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
e7a0: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
e7b0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e7c0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
e7d0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e7e0: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
e7f0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
e800: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
e810: 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  c || (pPager->jo
e820: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e830: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e840: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
e850: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e860: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
e870: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
e880: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
e890: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
e8a0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
e8b0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
e8c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
e8d0: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
e8e0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e8f0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
e900: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
e910: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
e920: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
e930: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e940: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
e950: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
e960: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
e970: 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  zer */ .  sqlite
e980: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
e990: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
e9a0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
e9b0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
e9c0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e9d0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e9e0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
e9f0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
ea00: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
ea10: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
ea20: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
ea30: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ea40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
ea50: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
ea60: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
ea70: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
ea80: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
ea90: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
eaa0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
eab0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eac0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
ead0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
eae0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
eaf0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
eb00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eb10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
eb20: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
eb30: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
eb40: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
eb50: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
eb60: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
eb70: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
eb80: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
eb90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
eba0: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
ebb0: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
ebc0: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
ebd0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
ebe0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
ebf0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
ec00: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
ec10: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
ec20: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
ec30: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
ec40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ec50: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
ec60: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
ec70: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
ec80: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
ec90: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
eca0: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
ecb0: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
ecc0: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
ecd0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
ece0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
ecf0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
ed00: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
ed10: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
ed20: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
ed30: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
ed40: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
ed50: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
ed60: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
ed70: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
ed80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
ed90: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
eda0: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
edb0: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
edc0: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
edd0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
ede0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
edf0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
ee00: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
ee10: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
ee20: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
ee30: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
ee40: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
ee50: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
ee60: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
ee70: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
ee80: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
ee90: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
eea0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
eeb0: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
eec0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
eed0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
eee0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
eef0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
ef00: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
ef10: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
ef20: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
ef30: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
ef40: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
ef50: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
ef60: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
ef70: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
ef80: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
ef90: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
efa0: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
efb0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
efc0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
efd0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
efe0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
eff0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
f000: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
f010: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
f020: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
f030: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
f040: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
f050: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
f060: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
f070: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
f080: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
f090: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
f0a0: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
f0b0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
f0c0: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
f0d0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f0e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
f0f0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
f100: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f110: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
f120: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f130: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
f140: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
f150: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f160: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
f170: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
f180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
f190: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f1a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
f1b0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
f1c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f1d0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
f1e0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
f1f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
f200: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
f210: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
f220: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
f230: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
f240: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f250: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
f260: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f270: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
f280: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
f290: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
f2a0: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
f2b0: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
f2c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
f2d0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
f2e0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
f2f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
f300: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
f310: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
f320: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
f330: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
f340: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
f350: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
f360: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
f370: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
f380: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
f390: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
f3a0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
f3b0: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
f3c0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
f3d0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
f3e0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
f3f0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
f400: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
f410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
f420: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f430: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
f440: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f450: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
f460: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
f470: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
f480: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
f490: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
f4a0: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
f4b0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
f4d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f4e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f4f0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
f500: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
f510: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
f520: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
f530: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
f540: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
f550: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
f560: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f570: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
f580: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
f590: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f5c0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
f5d0: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
f5e0: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
f5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f600: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
f610: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
f620: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
f630: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f650: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f660: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f670: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
f680: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
f690: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
f6a0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
f6b0: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
f6c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f6d0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
f6e0: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
f6f0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f700: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
f710: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
f720: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f730: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
f740: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
f750: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
f760: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
f770: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
f780: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f790: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
f7a0: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
f7b0: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
f7c0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
f7d0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f7e0: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
f7f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f800: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
f810: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
f820: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f830: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
f840: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
f850: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
f860: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f870: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
f880: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
f890: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
f8a0: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
f8b0: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
f8c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
f8d0: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
f8e0: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
f8f0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
f900: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f910: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
f920: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
f930: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
f940: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f950: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
f960: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
f970: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
f980: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
f990: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
f9a0: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
f9b0: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
f9c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
f9d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
f9e0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f9f0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
fa00: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
fa10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fa20: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
fa30: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
fa40: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
fa50: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
fa60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa70: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fa80: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
fa90: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
faa0: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
fab0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fac0: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
fad0: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
fae0: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
faf0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
fb00: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
fb10: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
fb20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
fb30: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
fb40: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
fb50: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
fb60: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
fb70: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
fb80: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
fb90: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
fba0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
fbb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fbc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fbd0: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
fbe0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
fbf0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
fc00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fc10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fc20: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
fc30: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
fc40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
fc50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fc60: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
fc70: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
fc80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fc90: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
fca0: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
fcb0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
fcc0: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
fcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
fce0: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
fcf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fd00: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
fd10: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
fd20: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
fd30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
fd40: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
fd50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fd60: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fd70: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fd80: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
fd90: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
fda0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdb0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fdc0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
fdd0: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
fde0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
fdf0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
fe00: 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20   /* Versions of 
fe10: 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
fe20: 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61  3.5.8 set the pa
fe30: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fe40: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
fe50: 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65  nal header to ze
fe60: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
fe70: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
fe80: 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  e Pager.pageSize
fe90: 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
fea0: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
feb0: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  to the correct p
fec0: 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  age size..    */
fed0: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
fee0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
fef0: 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
ff00: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
ff10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
ff20: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
ff30: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
ff40: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
ff50: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
ff60: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
ff70: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
ff80: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
ff90: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
ffa0: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
ffb0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
ffc0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
ffd0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
ffe0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
fff0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
10000 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
10010 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
10020 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
10030 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
10040 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
10050 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
10060 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
10070 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
10080 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
10090 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
100a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
100b0 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
100c0 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
100d0 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
100e0 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
100f0 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
10100 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
10110 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
10120 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
10130 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
10140 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
10150 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
10160 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
10170 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
10180 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
10190 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
101a0 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
101b0 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
101c0 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
101d0 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
101e0 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
101f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
10200 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
10210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10220 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
10230 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
10240 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
10250 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
10260 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
10270 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
10280 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
10290 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
102a0 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
102b0 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
102c0 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
102d0 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
102e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
102f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10300 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
10310 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
10320 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
10340 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10350 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
10360 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
10370 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
10380 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
10390 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
103a0 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
103b0 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
103c0 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
103d0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
103e0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
103f0 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
10400 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
10410 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
10420 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
10430 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
10440 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
10450 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
10460 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
10470 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
10480 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
10490 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
104a0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
104b0 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
104c0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
104d0 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
104e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
104f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10500 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
10510 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
10520 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10530 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
10540 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
10550 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
10560 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
10570 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
10580 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
10590 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
105a0 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
105b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
105c0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
105d0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
105e0 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
105f0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10600 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
10610 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
10620 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
10630 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
10640 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10650 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10660 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10670 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10680 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10690 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
106a0 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
106b0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
106c0 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
106d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
106e0 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
106f0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
10700 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
10710 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10720 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
10730 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
10740 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10750 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10760 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10770 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10780 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10790 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
107a0 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
107b0 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
107c0 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
107d0 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
107e0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
107f0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
10800 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
10810 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
10820 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
10830 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
10840 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10850 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10860 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10870 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10880 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10890 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
108c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
108d0 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
108e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
108f0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
10900 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
10910 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10930 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10940 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10950 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10960 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10970 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10990 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
109a0 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
109b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
109c0 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
109d0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
109e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
109f0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
10a00 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
10a10 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
10a20 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10a30 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10a40 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10a50 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10a60 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10a70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10a80 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10a90 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
10aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10ab0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10ac0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
10ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
10ae0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
10af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10b10 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10b20 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10b30 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10b40 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10b50 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10b60 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10b70 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10b80 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10b90 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10ba0 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10bb0 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10bc0 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10bd0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10be0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10bf0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10c00 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10c10 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10c20 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10c30 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10c40 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10c50 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10c60 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10c70 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10c80 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10c90 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10cb0 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10cc0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
10cd0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
10ce0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10cf0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
10d00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10d10 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
10d20 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10d30 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10d40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10d50 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10d60 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10d70 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10d80 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10d90 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10da0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10db0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10dc0 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
10dd0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10de0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10df0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
10e00 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
10e10 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
10e20 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10e30 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10e40 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10e50 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10e60 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10e70 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10e80 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10e90 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
10ea0 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
10eb0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10ec0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10ed0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10ee0 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
10ef0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
10f00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10f10 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10f20 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
10f30 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
10f40 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10f50 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10f60 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10f70 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
10f80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
10f90 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
10fa0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10fb0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10fc0 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
10fd0 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10fe0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
10ff0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
11000 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
11010 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
11020 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
11030 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
11040 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
11050 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
11060 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
11070 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
11080 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11090 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
110a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
110b0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
110c0 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
110d0 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
110e0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
110f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
11100 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
11110 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
11120 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
11130 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
11140 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11150 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
11160 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
11170 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
11180 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
11190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
111a0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
111b0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
111c0 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
111d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
111e0 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
111f0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
11200 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
11210 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
11220 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
11230 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
11240 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
11250 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
11260 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
11270 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
11280 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
11290 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
112a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
112b0 50 67 48 64 72 20 2a 70 20 3d 20 30 3b 20 20 20  PgHdr *p = 0;   
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
112e0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
112f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
11300 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
11310 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
11320 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
11330 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
11340 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
11350 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
11360 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
11370 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
11380 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
11390 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
113a0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
113b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
113c0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
113d0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
113e0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
113f0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
11400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11410 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
11420 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
11430 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11440 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11450 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11460 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11470 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11480 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
11490 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
114a0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
114b0 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
114c0 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
114d0 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
114e0 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
114f0 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
11500 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
11510 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
11520 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
11530 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
11540 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
11550 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
11560 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
11570 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11580 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11590 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
115a0 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
115b0 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
115c0 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
115d0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
115e0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
115f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
11600 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11610 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11620 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
11630 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
11640 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11650 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11660 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11670 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
11680 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11690 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
116a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
116b0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
116c0 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
116d0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
116e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
116f0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
11700 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
11710 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
11720 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
11730 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
11740 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11750 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11760 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11770 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
11780 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
11790 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
117a0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
117b0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
117c0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
117d0 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
117e0 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
117f0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
11800 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11830 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11840 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11850 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11860 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11870 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11880 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11890 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
118a0 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
118b0 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
118c0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
118d0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
118e0 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
118f0 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
11900 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
11910 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
11920 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11950 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11960 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11980 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11990 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
119a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
119b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
119c0 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
119d0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
119e0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
119f0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
11a00 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
11a10 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
11a20 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11a30 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11a40 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11a50 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11a60 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11a70 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11a80 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11a90 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11aa0 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11ab0 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11ac0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
11ad0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
11ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
11af0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
11b00 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
11b10 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11b20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11b30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11b40 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11b50 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11b60 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11b70 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11b80 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11b90 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11ba0 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11bb0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11bc0 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
11bd0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
11be0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
11bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
11c00 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
11c10 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
11c20 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11c30 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11c40 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11c50 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11c60 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11c70 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11c80 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11c90 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11ca0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11cb0 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11cc0 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
11cd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
11ce0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
11cf0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
11d00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11d10 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
11d20 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11d30 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11d40 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11d50 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11d60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11d70 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
11d80 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
11d90 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11da0 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
11db0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
11dc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
11dd0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
11de0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
11df0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
11e00 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
11e10 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
11e20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
11e30 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
11e40 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11e50 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11e60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11e90 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
11ea0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
11eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
11ec0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11ed0 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11ee0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11ef0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
11f00 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
11f10 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11f20 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
11f30 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
11f40 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11f50 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11f60 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11f70 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11f80 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
11f90 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
11fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11fb0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
11fc0 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
11fd0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11fe0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
11ff0 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
12000 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12010 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
12020 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12030 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12040 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
12050 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12060 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12080 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
12090 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
120a0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
120b0 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
120c0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
120d0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
120e0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
120f0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
12100 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12110 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
12120 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
12130 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
12140 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
12150 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
12160 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
12170 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
12180 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
12190 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
121a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
121b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
121c0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
121d0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
121e0 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
121f0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
12200 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
12210 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
12220 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
12230 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
12240 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
12250 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
12260 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
12270 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
12280 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
12290 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
122a0 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
122b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
122c0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
122d0 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
122e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
122f0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
12300 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
12310 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
12320 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
12330 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
12340 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
12350 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
12360 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
12370 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
12380 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
12390 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
123a0 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
123b0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
123c0 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
123d0 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
123e0 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
123f0 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
12400 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
12410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12420 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
12430 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
12440 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
12450 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
12460 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12470 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
12480 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12490 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
124a0 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
124b0 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
124c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
124d0 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
124e0 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
124f0 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
12500 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
12510 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
12520 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
12530 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
12540 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
12550 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
12560 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
12570 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
12580 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
12590 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
125a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
125b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
125c0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
125d0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
125e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
125f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12600 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
12610 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
12620 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12630 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12640 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12650 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12660 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
12670 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
12680 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
12690 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
126a0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
126b0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
126c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
126d0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
126e0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a  etMaster = 0;.}.
126f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12700 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
12710 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52  henever an IOERR
12720 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74   or FULL error t
12730 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20  hat requires.** 
12740 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61  the pager to tra
12750 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  nsition into the
12760 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79   ERROR state may
12770 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a   ahve occurred..
12780 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
12790 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
127a0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
127b0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
127c0 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72  econd .** the er
127d0 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
127e0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
127f0 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
12800 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76  ction. The .** v
12810 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
12820 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
12830 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
12840 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
12850 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
12860 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12870 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53  s SQLITE_FULL, S
12880 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f  QLITE_IOERR or o
12890 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45  ne of the.** IOE
128a0 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68  RR sub-codes, th
128b0 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74  e pager enters t
128c0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
128d0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
128e0 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  e.** is stored i
128f0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12900 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
12910 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
12920 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20  ERROR state,.** 
12930 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61  all major API ca
12940 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72  lls on the Pager
12950 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
12960 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65  y return Pager.e
12970 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  rrCode..**.** Th
12980 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  e ERROR state in
12990 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
129a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
129b0 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
129c0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
129d0 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
129e0 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
129f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
12a00 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
12a10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12a20 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
12a30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
12a40 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
12a50 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
12a60 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
12a70 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
12a80 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
12a90 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
12aa0 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
12ab0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12ad0 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
12ae0 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
12af0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
12b00 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
12b10 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12b20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
12b30 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
12b40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
12b50 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
12b60 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
12b70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12b80 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
12b90 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
12ba0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
12bb0 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
12bc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
12bd0 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
12be0 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20  OERR.  );.  if( 
12bf0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
12c00 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   || rc2==SQLITE_
12c10 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61  IOERR ){.    pPa
12c20 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
12c30 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  c;.    pPager->e
12c40 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52  State = PAGER_ER
12c50 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
12c60 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
12c70 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
12c80 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
12c90 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a  , Pgno nPage);..
12ca0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12cb0 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
12cc0 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
12cd0 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
12ce0 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
12cf0 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
12d00 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
12d10 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
12d20 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
12d30 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
12d40 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
12d50 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
12d60 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
12d70 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
12d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
12d90 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
12da0 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
12db0 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
12dc0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
12dd0 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ion..** .** This
12de0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
12df0 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45  r called in PAGE
12e00 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
12e10 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a  f it is called.*
12e20 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20  * in PAGER_NONE 
12e30 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  or PAGER_SHARED 
12e40 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f  state and the lo
12e50 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a  ck held is less.
12e60 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61  ** exclusive tha
12e70 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
12e80 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  k, it is a no-op
12e90 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
12ea0 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
12eb0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
12ec0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
12ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12ee0 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
12ef0 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
12f00 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
12f10 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
12f20 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
12f30 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12f40 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
12f50 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
12f60 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
12f70 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
12f80 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
12f90 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
12fa0 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
12fb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12fc0 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
12fd0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
12fe0 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
12ff0 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
13000 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
13010 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13020 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
13030 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
13040 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
13050 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
13060 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
13070 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
13080 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
13090 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
130a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
130b0 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
130c0 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
130d0 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
130e0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
130f0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
13100 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
13110 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
13120 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
13130 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
13140 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13150 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
13160 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
13170 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
13180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
13190 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
131a0 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
131b0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
131c0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
131d0 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
131e0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
131f0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
13200 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
13210 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
13220 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
13230 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13240 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
13250 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
13260 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
13270 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
13280 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13290 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
132a0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
132b0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
132c0 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
132d0 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
132e0 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
132f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
13300 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
13310 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
13320 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
13330 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
13340 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
13350 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
13360 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
13370 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
13380 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
13390 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
133a0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
133b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
133c0 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65  alized, the page
133d0 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
133e0 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a  _READER state..*
133f0 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
13400 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f  non-exclusive ro
13410 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65  llback mode, the
13420 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
13430 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61  e is .** downgra
13440 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f  ded to a SHARED_
13450 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
13460 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
13470 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
13480 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
13490 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
134a0 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
134b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
134c0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
134d0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
134e0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
134f0 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
13500 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13510 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
13520 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
13530 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
13540 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13550 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
13560 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
13570 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
13580 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
13590 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
135a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
135b0 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
135c0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
135d0 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
135e0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
135f0 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
13600 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
13610 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
13620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
13630 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
13640 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
13650 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13660 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13670 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
13680 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e  nt hasMaster, in
13690 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e  t bCommit){.  in
136a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
136b0 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  ;      /* Error 
136c0 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  code from journa
136d0 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
136e0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
136f0 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
13700 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  K;     /* Error 
13710 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c  code from db fil
13720 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  e unlock operati
13730 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  on */..  /* Do n
13740 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61  othing if the pa
13750 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
13760 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
13770 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
13780 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52   or at least a R
13790 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68  ESERVED lock. Th
137a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
137b0 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
137c0 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
137d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
137e0 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52  n active but a R
137f0 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
13800 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20  er lock is.  ** 
13810 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63  held under two c
13820 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20  ircumstances:.  
13830 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74  **.  **   1. Aft
13840 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  er a successful 
13850 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
13860 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c  back, it is call
13870 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20  ed with.  **    
13880 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f    eState==PAGER_
13890 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d  NONE and eLock==
138a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
138b0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49    **.  **   2. I
138c0 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  f a connection w
138d0 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ith locking_mode
138e0 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69  =exclusive holdi
138f0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
13900 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20  .  **      lock 
13910 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f  switches back to
13920 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
13930 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78  rmal and then ex
13940 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20  ecutes a.  **   
13950 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74     read-transact
13960 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ion, this functi
13970 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  on is called wit
13980 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  h eState==PAGER_
13990 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20  READER .  **    
139a0 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43    and eLock==EXC
139b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e  LUSIVE_LOCK when
139c0 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
139d0 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
139e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
139f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
13a00 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
13a10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13a20 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
13a30 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ROR );.  if( pPa
13a40 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
13a50 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
13a60 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
13a70 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  <RESERVED_LOCK )
13a80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13a90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
13aa0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
13ab0 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61  nts(pPager);.  a
13ac0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13ad0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
13ae0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
13af0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
13b00 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13b10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13b20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
13b30 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
13b40 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
13b50 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
13b60 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
13b70 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
13b80 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
13b90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13ba0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13bb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
13bc0 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73  EMORY );.      s
13bd0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13be0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
13bf0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
13c00 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13c10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13c20 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
13c30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
13c40 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
13c50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13c60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
13c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13c80 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
13c90 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
13ca0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13cb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13cc0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
13cd0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13ce0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13cf0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13d00 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c  PERSIST.      ||
13d10 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
13d20 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
13d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
13d40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13d50 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20  E_WAL).    ){.  
13d60 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
13d70 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
13d80 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  hasMaster);.    
13d90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13da0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13db0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
13dc0 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
13dd0 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
13de0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
13df0 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
13e00 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
13e10 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
13e20 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
13e30 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
13e40 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
13e50 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
13e60 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
13e70 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
13e80 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
13e90 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
13ea0 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
13eb0 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
13ec0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
13ed0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
13ee0 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28   int bDelete = (
13ef0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
13f00 65 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72  e && sqlite3Jour
13f10 6e 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72  nalExists(pPager
13f20 2d 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61  ->jfd));.      a
13f30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13f40 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13f50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13f60 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13f70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13f80 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13f90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13fa0 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13fb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13fc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13fd0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13fe0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13ff0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14000 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
14010 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
14020 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14030 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
14040 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
14050 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
14060 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14070 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14080 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
14090 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
140a0 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
140b0 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
140c0 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
140d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
140e0 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
140f0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
14100 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
14110 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
14120 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  p = pager_lookup
14130 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
14140 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
14150 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b  p->pageHash = 0;
14160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14170 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
14180 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
14190 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42  ndif..  sqlite3B
141a0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
141b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
141c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
141d0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50  ournal = 0;.  pP
141e0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
141f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
14200 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
14210 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69  pPCache);.  sqli
14220 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
14230 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
14240 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
14250 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  e);..  if( pager
14260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
14270 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  {.    /* Drop th
14280 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b  e WAL write-lock
14290 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20  , if any. Also, 
142a0 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
142b0 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a  n was in .    **
142c0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
142d0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74  clusive mode but
142e0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64   is no longer, d
142f0 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
14300 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68  E .    ** lock h
14310 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
14320 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
14330 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
14340 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
14350 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
14360 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
14370 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
14380 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OK );.  }else if
14390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
143a0 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50  && bCommit && pP
143b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
143c0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
143d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ){.    /* This b
143e0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
143f0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
14400 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
14410 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
14420 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20  .    ** mode if 
14430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14440 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72  e on disk is lar
14450 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
14460 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
14470 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
14480 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  t the journal ha
14490 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
144a0 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
144b0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63  tion .    ** suc
144c0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74  cessfully commit
144d0 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43  ted, but the EXC
144e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73  LUSIVE lock is s
144f0 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
14500 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
14510 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74   it is safe to t
14520 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
14530 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73  base file to its
14540 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
14550 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20  required size.  
14560 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
14570 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
14580 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
14590 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
145a0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
145b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
145c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
145d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
145e0 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70  mmit && isOpen(p
145f0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
14600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14610 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
14620 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
14630 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53  CNTL_COMMIT_PHAS
14640 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66  ETWO, 0);.    if
14650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
14660 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
14670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
14680 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
14690 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
146a0 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
146b0 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
146c0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
146d0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
146e0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
146f0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
14700 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
14710 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
14720 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
14730 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
14740 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
14750 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
14760 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
14770 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
14780 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
14790 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
147a0 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
147b0 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
147c0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
147d0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
147e0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
147f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
14800 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
14810 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
14820 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
14830 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
14840 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
14850 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
14860 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14870 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
14880 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14890 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
148a0 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
148b0 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
148c0 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
148d0 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
148e0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
148f0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
14900 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
14910 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
14920 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
14930 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
14940 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
14950 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
14960 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
14970 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
14980 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
14990 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
149a0 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
149b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
149c0 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
149d0 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
149e0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
149f0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
14a00 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
14a10 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
14a20 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
14a30 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
14a40 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
14a50 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
14a60 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
14a70 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
14a80 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14a90 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14aa0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14ab0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14ac0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14ad0 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
14ae0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14af0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
14b00 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
14b10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14b20 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
14b30 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14b40 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14b50 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14b60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14b70 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14b80 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14b90 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14ba0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14bb0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14bc0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14bd0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
14be0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14bf0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
14c00 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14c10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14c20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14c30 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14c40 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14c50 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14c60 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ager, 0, 0);.   
14c70 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
14c80 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
14c90 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
14ca0 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
14cb0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
14cc0 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
14cd0 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
14ce0 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
14cf0 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
14d00 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
14d10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14d20 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
14d30 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
14d40 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
14d50 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
14d60 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
14d70 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
14d80 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
14d90 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
14da0 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
14db0 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
14dc0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
14dd0 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
14de0 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
14df0 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
14e00 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
14e10 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
14e20 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
14e30 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
14e40 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
14e50 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
14e60 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
14e70 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
14e80 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
14e90 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
14ea0 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
14eb0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
14ec0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
14ed0 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
14ee0 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
14ef0 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
14f00 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
14f10 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
14f20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
14f30 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
14f40 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
14f50 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
14f60 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
14f70 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
14f80 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
14f90 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
14fa0 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
14fb0 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
14fc0 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
14fd0 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
14fe0 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
14ff0 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
15000 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
15010 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
15020 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
15030 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
15040 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
15050 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
15060 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
15070 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
15080 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
15090 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
150a0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
150b0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
150c0 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
150d0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
150e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
150f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
15100 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
15110 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
15120 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
15130 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
15140 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
15150 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
15160 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
15170 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
15180 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
15190 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
151a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
151b0 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
151c0 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
151d0 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
151e0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
151f0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
15200 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
15210 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
15220 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
15230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15240 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
15260 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
15270 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
15280 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
15290 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
152a0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
152b0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
152c0 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
152d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
152e0 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
152f0 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
15300 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
15310 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
15320 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
15330 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
15340 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
15350 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
15360 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
15370 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
15380 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
15390 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
153a0 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
153b0 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
153c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
153d0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
153e0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
153f0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
15400 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
15410 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
15420 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
15430 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
15440 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
15450 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
15460 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
15470 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15480 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
15490 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
154a0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
154b0 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
154c0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
154d0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
154e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
154f0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
15500 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
15510 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
15520 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
15530 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
15540 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
15550 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
15560 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
15570 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
15580 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
15590 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
155a0 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
155b0 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
155c0 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
155d0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
155e0 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
155f0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
15600 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
15610 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
15620 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
15630 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
15640 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
15650 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
15660 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15670 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
15680 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
15690 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
156a0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
156b0 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
156c0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
156d0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
156e0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
156f0 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
15700 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
15710 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
15720 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
15730 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15740 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
15750 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
15760 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15770 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
15780 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
15790 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
157a0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
157b0 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
157c0 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
157d0 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
157e0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
157f0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15800 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
15810 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
15820 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
15830 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
15840 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
15850 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
15860 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
15870 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
15880 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
15890 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
158a0 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
158b0 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
158c0 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
158d0 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
158e0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
158f0 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
15900 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
15910 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
15920 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15930 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
15940 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
15950 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
15960 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
15970 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
15980 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
15990 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
159a0 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
159b0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
159c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
159d0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
159e0 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
159f0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
15a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15a10 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
15a20 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
15a30 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
15a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15a50 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
15a60 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
15a70 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a90 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
15aa0 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
15ab0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
15ac0 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
15ad0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
15ae0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
15af0 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
15b00 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
15b10 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
15b20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
15b30 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15b40 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
15b50 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
15b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15b70 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
15b80 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
15b90 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
15ba0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
15bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15bc0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
15bd0 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
15be0 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
15c10 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
15c20 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
15c30 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
15c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
15c50 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
15c60 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
15c70 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15c80 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
15c90 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
15ca0 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
15cb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
15cc0 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ce0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
15cf0 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
15d00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
15d10 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
15d20 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
15d30 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
15d40 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
15d50 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
15d60 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
15d70 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
15d80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
15d90 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
15da0 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
15db0 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
15dc0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
15dd0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
15de0 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
15df0 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
15e00 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
15e10 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
15e20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
15e30 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
15e40 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
15e50 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
15e60 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
15e70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
15e80 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
15e90 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
15ea0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
15eb0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
15ec0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
15ed0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
15ee0 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
15ef0 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
15f00 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
15f10 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
15f20 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
15f30 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
15f40 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
15f50 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
15f60 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
15f70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
15f80 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
15f90 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
15fa0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
15fb0 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
15fc0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
15fd0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
15fe0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15ff0 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
16000 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
16010 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
16020 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
16030 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
16040 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
16050 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
16060 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
16070 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16080 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
16090 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
160a0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
160b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
160c0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
160d0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
160e0 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
160f0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
16100 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
16110 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
16120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
16130 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
16140 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
16150 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
16160 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
16170 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
16180 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
16190 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
161a0 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
161b0 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
161c0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
161d0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
161e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
161f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
16200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16210 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
16220 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
16230 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
16240 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
16250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16260 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
16270 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
16280 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
16290 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
162a0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
162b0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
162c0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
162d0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
162e0 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
162f0 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
16300 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
16310 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
16320 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
16330 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
16340 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
16350 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
16360 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
16370 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
16380 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
16390 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
163a0 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
163b0 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
163c0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
163d0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
163e0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
163f0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
16400 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
16410 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
16420 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
16430 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
16440 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
16450 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
16460 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
16470 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
16480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16490 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
164a0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
164b0 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
164c0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
164d0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
164e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
164f0 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
16500 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
16510 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
16520 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
16530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16540 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
16550 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
16560 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
16570 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62  been played by b
16580 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65  efore during the
16590 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f   current.  ** ro
165a0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e  llback, then don
165b0 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61  't bother to pla
165c0 79 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e  y it back again.
165d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e  .  */.  if( pDon
165e0 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
165f0 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
16600 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
16610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
16620 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
16630 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
16640 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f  ck page 1, resto
16650 72 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  re the nReserve 
16660 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69  setting.  */.  i
16670 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  f( pgno==1 && pP
16680 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d  ager->nReserve!=
16690 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
166a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
166b0 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a  nReserve = ((u8*
166c0 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20  )aData)[20];.   
166d0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
166e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
166f0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
16700 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20   is in CACHEMOD 
16710 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
16720 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
16730 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
16740 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
16750 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
16760 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
16770 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
16780 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
16790 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
167a0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
167b0 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
167c0 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
167d0 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
167e0 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
167f0 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
16800 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
16810 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
16820 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
16830 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
16840 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
16850 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
16860 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
16870 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
16880 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
16890 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
168a0 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
168b0 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
168c0 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
168d0 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
168e0 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
168f0 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
16900 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
16910 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
16920 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
16930 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
16940 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
16950 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
16960 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  , WRITER_FINISHE
16970 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
16980 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
16990 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63  the.  ** pager c
169a0 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
169b0 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  s and the main f
169c0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
169d0 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20   then marked .  
169e0 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69  ** not dirty. Si
169f0 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73  nce this code is
16a00 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69   only executed i
16a10 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
16a20 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f  te for.  ** a ho
16a30 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16a40 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ck, it is guaran
16a50 74 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61  teed that the pa
16a60 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74  ge-cache is empt
16a70 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61  y.  ** if the pa
16a80 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73  ger is in OPEN s
16a90 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tate..  **.  ** 
16aa0 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
16ab0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
16ac0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
16ad0 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
16ae0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
16af0 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
16b00 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
16b10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16b20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
16b30 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
16b40 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
16b50 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
16b60 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
16b70 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
16b80 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
16b90 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
16ba0 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
16bb0 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
16bc0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
16bd0 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
16be0 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
16bf0 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
16c00 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
16c10 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
16c20 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16c30 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
16c40 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
16c50 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
16c60 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
16c70 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
16c80 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
16c90 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
16ca0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16cb0 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
16cc0 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
16cd0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
16ce0 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
16cf0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
16d00 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
16d10 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
16d20 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
16d30 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
16d40 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16d50 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
16d60 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
16d70 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
16d80 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
16d90 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
16da0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
16db0 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
16dc0 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
16dd0 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
16de0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
16df0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
16e00 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
16e10 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
16e20 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
16e30 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
16e40 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
16e50 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
16e60 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
16e70 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
16e80 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
16e90 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
16ea0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
16eb0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
16ec0 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
16ed0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
16ee0 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
16ef0 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
16f00 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
16f10 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
16f20 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
16f30 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
16f40 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
16f50 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16f60 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
16f70 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
16f80 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
16f90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
16fa0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te!=PAGER_OPEN |
16fb0 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41  | pPg==0 );.  PA
16fc0 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
16fd0 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
16fe0 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
16ff0 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
17000 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
17010 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
17020 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
17030 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
17040 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
17050 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
17060 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
17070 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
17080 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
17090 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
170a0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
170b0 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
170c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
170d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
170e0 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
170f0 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
17100 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
17110 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
17120 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
17130 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
17140 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17150 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
17160 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
17170 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
17180 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
17190 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
171a0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
171b0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
171c0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
171d0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
171e0 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
171f0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
17200 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
17210 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17220 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17240 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
17250 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
17260 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17270 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  e, ofst);.    if
17280 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
17290 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
172a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
172b0 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
172c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
172d0 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
172e0 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
172f0 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
17300 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
17310 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MEM);.      sqli
17320 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
17330 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
17340 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
17350 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32  a);.      CODEC2
17360 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
17370 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
17380 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29  TE_NOMEM, aData)
17390 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
173a0 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
173b0 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
173c0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
173d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
173e0 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
173f0 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
17400 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
17410 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
17420 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
17430 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
17440 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
17450 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
17460 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
17470 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
17480 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
17490 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
174a0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
174b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
174c0 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
174d0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
174e0 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
174f0 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
17500 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
17510 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
17520 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
17530 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
17540 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
17550 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
17560 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
17570 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
17580 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
17590 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
175a0 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
175b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
175c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
175d0 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
175e0 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
175f0 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
17600 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
17610 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
17620 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
17630 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
17640 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
17650 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
17660 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
17670 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
17680 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
17690 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
176a0 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
176b0 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
176c0 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
176d0 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
176e0 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
176f0 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
17700 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
17710 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
17720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
17730 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
17740 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
17750 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17760 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
17770 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20  LBACK)==0 );.   
17780 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17790 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
177a0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72  _ROLLBACK;.    r
177b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
177c0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
177d0 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
177e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
177f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
17800 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
17810 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20  BACK)!=0 );.    
17820 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17830 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
17840 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69  _ROLLBACK;.    i
17850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17860 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17870 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
17880 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
17890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
178a0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
178b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
178c0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
178d0 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
178e0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
178f0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17900 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17910 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17920 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17930 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
17940 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17950 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
17960 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
17970 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
17980 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
17990 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
179a0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
179b0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
179c0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
179d0 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
179e0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
179f0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17a00 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17a10 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17a20 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17a30 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
17a40 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17a50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
17a70 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
17a80 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17a90 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17aa0 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17ac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17ad0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17ae0 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17af0 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17b00 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17b10 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17b20 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17b30 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17b40 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17b50 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
17b60 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
17b70 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
17b80 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17b90 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17ba0 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17bb0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17bc0 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17bd0 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17be0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17bf0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17c00 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17c10 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17c20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17c30 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17c40 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17c50 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
17c60 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
17c70 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
17c80 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17c90 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17ca0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17cb0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17cc0 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17cd0 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17ce0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17cf0 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17d00 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17d10 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17d20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17d30 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17d40 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17d50 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17d60 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17d70 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17d80 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17d90 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17da0 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17db0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17dc0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17dd0 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17de0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17df0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17e00 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17e10 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17e20 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17e30 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17e40 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17e50 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17e60 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17e70 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17e80 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17e90 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17ea0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17eb0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17ed0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17ee0 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17ef0 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17f00 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17f10 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17f20 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17f30 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17f40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17f50 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17f60 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17f70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17f80 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17f90 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17fa0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17fb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17fc0 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17fd0 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17fe0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17ff0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
18000 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
18010 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
18020 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
18030 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
18040 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
18050 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
18060 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
18070 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
18080 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
18090 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
180a0 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
180b0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
180c0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
180d0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
180e0 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
180f0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
18100 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
18110 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
18120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
18130 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
18140 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
18150 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18160 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
18170 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
18180 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
18190 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
181a0 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
181b0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
181c0 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
181d0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
181e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
181f0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
18200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
18210 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
18220 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
18230 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
18240 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
18250 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
18260 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
18270 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
18280 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
18290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
182a0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
182b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
182c0 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
182d0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
182e0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
182f0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18300 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18310 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18320 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18330 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
18340 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
18350 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
18360 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
18370 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
18380 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
18390 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
183a0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
183b0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
183c0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
183d0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
183e0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
183f0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18400 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18410 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18420 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18430 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
18440 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
18450 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
18460 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
18470 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
18480 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
18490 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
184a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
184b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
184c0 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
184d0 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
184e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
184f0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18500 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18510 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18520 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18530 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
18540 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
18550 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
18560 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
18570 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
18580 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
18590 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
185a0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
185b0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
185c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
185d0 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
185e0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
185f0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18600 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18610 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18620 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18630 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
18640 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
18650 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
18660 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
18670 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
18680 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
18690 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
186a0 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
186b0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
186c0 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
186d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
186e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
186f0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18700 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18710 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18720 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18730 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
18740 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18750 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
18760 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
18770 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
18780 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
18790 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
187a0 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
187b0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
187c0 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
187d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
187e0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
187f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18800 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18810 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18820 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18830 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18840 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18850 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
18860 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
18870 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
18880 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
18890 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
188a0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
188b0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
188c0 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
188d0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
188e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
188f0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18900 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18910 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18920 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18930 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18940 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18950 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
18960 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
18970 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18980 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18990 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
189a0 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
189b0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
189c0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
189d0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
189e0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
189f0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18a00 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18a10 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18a20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18a30 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
18a40 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18a50 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
18a60 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
18a70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18a80 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
18a90 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18aa0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18ab0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18ac0 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18ad0 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18ae0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18af0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18b00 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18b10 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18b20 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18b30 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18b40 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18b50 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
18b60 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
18b70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
18b80 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18b90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18ba0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18bb0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18bc0 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18bd0 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18be0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18bf0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18c00 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18c10 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18c20 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18c30 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18c40 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18c50 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
18c60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
18c80 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18c90 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18ca0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18cb0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18cc0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18cd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18ce0 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18cf0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18d00 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18d10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18d20 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18d30 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18d40 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18d60 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18d70 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18d80 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18d90 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18da0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18db0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18dc0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18dd0 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18de0 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18df0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18e00 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18e10 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18e20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18e30 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18e50 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18e60 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18e70 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18e80 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18e90 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ea0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18eb0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18ec0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18ed0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18ee0 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18ef0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18f00 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18f10 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18f20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18f30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18f40 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18f50 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18f60 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18f70 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18f80 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18f90 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18fa0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18fb0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18fc0 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18fe0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18ff0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
19000 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
19010 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
19020 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
19030 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
19040 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
19050 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
19060 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
19070 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
19080 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19090 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
190a0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
190b0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
190c0 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
190d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
190e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
190f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19100 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
19110 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
19120 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
19130 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
19140 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19150 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
19160 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
19170 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
19180 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
19190 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
191a0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
191b0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
191c0 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
191d0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
191e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
191f0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
19200 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19210 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19220 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
19230 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
19240 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19250 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
19260 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
19270 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19290 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
192a0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
192b0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
192c0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
192d0 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
192e0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
192f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19300 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19310 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19330 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19340 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19350 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
19360 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
19370 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
19380 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
19390 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
193a0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
193b0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
193c0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
193d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
193e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
193f0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19410 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19420 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19430 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19440 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19450 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
19460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
19470 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
19480 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
19490 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
194a0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
194b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
194c0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
194d0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
194e0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
194f0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19500 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19510 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19520 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19530 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19540 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19550 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
19560 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
19570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
19580 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
19590 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
195a0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
195b0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
195c0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
195d0 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
195e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
195f0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19600 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19610 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19620 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19630 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19640 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19650 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
19660 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
19670 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
19680 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
19690 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
196a0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
196b0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
196c0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
196d0 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
196e0 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
196f0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19700 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19710 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19720 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19730 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19740 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19750 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
19760 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
19770 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
19780 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
19790 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
197a0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
197b0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
197c0 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
197d0 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
197e0 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
197f0 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19800 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19810 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19820 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19830 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
19840 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19850 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
19860 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
19870 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
19880 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19890 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
198a0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
198b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
198c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
198d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
198e0 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
198f0 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19900 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19910 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19920 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19940 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19950 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19960 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
19970 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19990 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
199a0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
199b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
199c0 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
199d0 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
199e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
199f0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19a00 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19a10 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19a20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19a30 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19a40 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19a50 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
19a60 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
19a70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19a80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19a90 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19aa0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19ab0 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19ac0 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19ad0 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19ae0 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19af0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19b00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19b10 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19b20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19b30 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19b40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19b50 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19b60 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19b70 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19b80 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19b90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19ba0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19bb0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19bc0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19bd0 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19be0 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19bf0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19c00 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19c10 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19c20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19c30 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19c40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c50 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19c60 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
19c70 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19c80 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19c90 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
19ca0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19cc0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19cd0 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19ce0 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19d10 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19d20 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19d30 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19d40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19d50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19d60 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19d70 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19d80 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19d90 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19da0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19db0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19dc0 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19dd0 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19de0 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19df0 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19e10 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19e20 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19e30 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19e40 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19e50 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19e60 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19e70 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19e80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19e90 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19ea0 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19eb0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19ec0 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19ed0 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19ee0 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19ef0 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19f00 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19f10 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19f20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19f30 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19f40 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19f50 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19f60 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19f70 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19f80 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19f90 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19fa0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19fb0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19fc0 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19fd0 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19fe0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19ff0 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
1a000 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
1a010 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
1a020 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
1a030 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a040 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
1a050 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
1a060 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
1a070 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
1a080 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
1a090 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a0a0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
1a0b0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1a0c0 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
1a0d0 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
1a0e0 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
1a0f0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
1a100 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
1a110 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
1a120 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
1a130 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
1a140 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
1a150 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a160 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
1a170 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a180 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
1a190 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
1a1a0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a1b0 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
1a1c0 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
1a1d0 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
1a1e0 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
1a1f0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
1a200 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
1a210 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
1a220 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
1a230 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
1a240 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
1a250 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
1a260 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
1a270 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
1a280 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
1a290 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
1a2a0 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
1a2b0 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a2c0 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a2d0 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a2e0 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a2f0 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a300 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a310 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a320 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a340 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a350 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a360 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a370 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a390 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a3a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a3b0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a3c0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a3d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a3e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a3f0 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a400 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a410 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a420 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a430 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a440 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a450 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a460 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a470 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a480 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a490 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a4a0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a4b0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a4c0 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a4d0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a4e0 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a4f0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a500 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a510 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a520 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a530 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a540 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a550 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a560 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a570 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a580 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a590 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a5b0 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a5c0 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a5d0 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a5e0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a5f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a600 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a610 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a620 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a630 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a640 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a650 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a660 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a670 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a680 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a690 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a6a0 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a6b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a6c0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a6d0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a6e0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a6f0 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a700 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a710 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a720 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a730 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a740 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a750 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a760 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a770 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a780 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a790 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a7a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a7b0 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a7c0 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a7d0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a7e0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a7f0 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a800 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a810 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a820 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a830 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a840 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a850 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a860 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a870 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a880 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a890 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a8a0 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a8b0 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a8c0 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a8d0 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a8e0 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a8f0 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a900 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a910 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a920 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a930 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a940 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a950 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a960 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a970 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a980 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a990 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a9a0 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a9b0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a9c0 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a9d0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a9e0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a9f0 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1aa00 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1aa10 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1aa20 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1aa30 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1aa40 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1aa50 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1aa60 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1aa70 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1aa80 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1aa90 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1aaa0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1aab0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1aac0 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1aad0 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1aae0 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1aaf0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1ab00 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1ab10 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1ab20 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1ab30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1ab40 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1ab50 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1ab60 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1ab70 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1ab80 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1ab90 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1aba0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1abb0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1abc0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1abd0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1abe0 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1abf0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1ac00 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1ac10 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1ac20 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1ac30 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1ac40 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1ac50 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1ac60 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1ac70 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1ac80 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1ac90 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1aca0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1acb0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1acc0 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1acd0 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1ace0 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1acf0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1ad00 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1ad10 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1ad20 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1ad30 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1ad40 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1ad50 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1ad60 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1ad70 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1ad80 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1ad90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1ada0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1adb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1adc0 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1add0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ade0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1adf0 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ae00 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ae10 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ae20 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ae30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ae40 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1ae50 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1ae60 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1ae70 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1ae80 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1ae90 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1aea0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1aeb0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1aec0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1aed0 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1aee0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1aef0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1af00 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1af10 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1af20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1af30 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1af40 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1af50 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1af60 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1af70 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1af80 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1af90 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1afa0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1afb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1afc0 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1afd0 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1afe0 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1aff0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1b000 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1b010 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1b020 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1b030 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1b040 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1b050 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1b060 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1b070 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1b080 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1b090 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1b0a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b0b0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1b0c0 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1b0d0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1b0e0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1b0f0 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1b100 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1b110 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b130 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1b140 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1b150 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b160 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1b170 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1b180 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1b190 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b1a0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b1b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1b1c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b1d0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1b1e0 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1b1f0 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1b200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b210 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1b220 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1b230 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1b240 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1b250 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1b260 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1b270 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1b280 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1b290 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b2a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b2b0 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b2c0 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b2d0 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b2e0 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b2f0 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b300 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b310 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b320 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b330 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b340 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b350 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b360 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b370 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b380 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b390 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b3a0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b3b0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b3c0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b3d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b3e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b3f0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b400 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b420 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b430 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b440 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b450 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b460 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b470 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b480 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b490 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b4a0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b4b0 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b4c0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b4d0 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b4e0 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b4f0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b500 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b510 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b520 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b530 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b540 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b550 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b560 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b570 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b580 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b590 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b5a0 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b5b0 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b5c0 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b5d0 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b5e0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b5f0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b600 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b610 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b620 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b630 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b640 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b650 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b660 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b670 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b680 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b690 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b6a0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b6b0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b6c0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b6d0 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b6e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b6f0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b700 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b710 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b720 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b730 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b740 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b750 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b760 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b770 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b780 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b790 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b7a0 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b7b0 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b7c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b7d0 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b7e0 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b7f0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b800 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b810 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b820 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b830 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b840 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b850 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b860 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b870 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b880 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b890 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b8a0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b8b0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b8c0 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b8d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b8e0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b8f0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b900 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b910 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b920 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b930 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b940 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b950 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b960 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b970 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b980 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b990 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b9a0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b9b0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b9c0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b9d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b9e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b9f0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1ba00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ba10 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1ba20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ba30 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1ba40 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1ba50 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1ba60 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1ba70 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1ba80 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1ba90 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1baa0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1bab0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1bac0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1bad0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1bae0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1baf0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1bb00 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1bb10 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1bb20 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1bb30 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1bb40 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1bb50 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1bb60 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1bb70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bb80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1bb90 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1bba0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1bbb0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1bbc0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1bbd0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1bbe0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1bbf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bc00 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1bc10 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1bc20 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1bc30 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1bc40 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1bc50 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1bc60 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1bc70 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1bc80 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1bc90 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1bca0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1bcb0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1bcc0 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1bcd0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1bce0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1bcf0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1bd00 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1bd10 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1bd20 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1bd30 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1bd40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1bd50 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1bd60 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1bd70 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1bd80 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1bd90 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1bda0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1bdb0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1bdc0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1bdd0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1bde0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1bdf0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1be00 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1be10 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1be20 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1be30 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1be40 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1be50 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1be60 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1be70 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1be80 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1be90 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bea0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1beb0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bec0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bed0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bee0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bef0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bf00 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bf10 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bf20 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bf30 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bf40 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bf50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bf60 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bf70 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bf80 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bf90 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bfa0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bfb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bfc0 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bfd0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bfe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bff0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1c000 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1c010 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1c020 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1c030 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1c040 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1c050 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1c060 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1c070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1c080 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1c090 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c0a0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1c0b0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1c0c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c0e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c0f0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1c100 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1c110 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1c120 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1c130 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1c140 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1c150 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1c160 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1c170 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1c180 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1c190 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1c1a0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1c1b0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1c1c0 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1c1d0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c1e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c1f0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c200 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c210 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1c220 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1c230 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1c240 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1c250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c270 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1c280 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1c290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c2a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1c2b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c2c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c2d0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c2e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c2f0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c300 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c310 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c320 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c330 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c340 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c350 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c360 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c370 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c380 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c390 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c3a0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c3b0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c3c0 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c3d0 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c3e0 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c3f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c400 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c410 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c420 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c430 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c440 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c450 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c460 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c470 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c490 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c4a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c4b0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c4c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c4d0 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c4e0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c4f0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c500 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c510 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c520 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c530 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c540 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c550 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c560 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c570 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c580 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c590 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c5a0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c5b0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c5c0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c5d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c5e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c5f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c600 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c610 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c620 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c630 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c640 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c650 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c660 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c680 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c690 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c6a0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c6b0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c6c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c6d0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c6e0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c6f0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c700 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c710 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c720 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c730 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c740 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c750 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c760 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c770 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c780 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c790 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c7a0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c7b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c7c0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c7d0 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c7e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c7f0 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c800 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c810 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c820 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c830 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c840 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c850 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c860 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c870 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c880 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c890 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c8a0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c8b0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c8c0 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c8d0 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c8e0 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c8f0 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c900 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c910 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c920 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c930 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c940 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c950 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c960 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c970 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c980 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c990 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c9a0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c9b0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c9c0 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c9d0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c9e0 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c9f0 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1ca00 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1ca10 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1ca20 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1ca30 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1ca40 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1ca50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1ca60 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1ca70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1ca80 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1ca90 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1caa0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1cab0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1cac0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1cad0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1cae0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1caf0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1cb00 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1cb10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cb20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1cb30 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1cb40 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1cb50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1cb60 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1cb70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cb80 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1cb90 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1cba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cbb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1cbc0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1cbd0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1cbe0 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1cbf0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1cc00 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1cc10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cc20 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1cc30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1cc40 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1cc50 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1cc60 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1cc70 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1cc80 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1cc90 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1cca0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1ccb0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1ccc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1ccd0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1cce0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1ccf0 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1cd00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cd10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1cd20 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1cd30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1cd40 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1cd50 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1cd60 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1cd70 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1cd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd90 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1cda0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1cdb0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1cdc0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1cdd0 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1cde0 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1cdf0 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1ce00 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1ce10 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1ce20 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1ce30 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1ce40 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1ce50 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1ce60 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1ce70 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1ce80 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1ce90 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1cea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1ceb0 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1cec0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1ced0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1cee0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1cef0 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1cf00 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1cf10 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1cf20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1cf30 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1cf40 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1cf50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1cf60 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1cf70 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1cf80 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1cf90 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1cfa0 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1cfb0 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1cfc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cfd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1cfe0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1cff0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1d000 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1d010 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1d020 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1d030 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1d050 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1d060 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65  *pPg, u32 iFrame
1d070 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1d080 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d090 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1d0a0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1d0b0 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1d0c0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1d0d0 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1d0e0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1d0f0 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1d100 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1d110 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d120 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  code */.  int pg
1d130 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1d140 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1d150 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1d160 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1d170 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d180 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1d190 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1d1a0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1d1b0 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64  r->fd) );..#ifnd
1d1c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d1d0 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20  AL.  if( iFrame 
1d1e0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
1d1f0 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
1d200 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
1d210 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
1d220 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1d230 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1d240 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70  >pWal, iFrame, p
1d250 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
1d260 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1d270 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1d280 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1d290 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1d2a0 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1d2b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1d2c0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1d2d0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1d2e0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1d2f0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1d300 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1d310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d320 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1d330 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1d340 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d350 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1d360 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1d370 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1d380 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1d390 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1d3a0 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1d3b0 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1d3c0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1d3d0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1d3e0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1d3f0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1d400 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1d410 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1d420 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1d430 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1d440 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1d450 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1d460 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1d470 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1d480 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1d490 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1d4a0 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1d4b0 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1d4c0 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1d4d0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1d4e0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1d4f0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1d500 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1d510 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1d520 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1d530 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1d540 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1d550 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1d560 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d570 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1d580 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1d590 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1d5a0 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1d5b0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1d5c0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1d5d0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1d5e0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1d5f0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1d600 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d610 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1d620 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1d630 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1d640 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1d650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d660 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1d670 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1d680 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1d690 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1d6a0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1d6b0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1d6c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d6d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1d6e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1d6f0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1d700 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1d710 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1d720 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1d730 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1d740 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1d750 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1d760 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1d770 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1d780 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1d790 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1d7a0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1d7b0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1d7c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1d7d0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1d7e0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1d7f0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1d800 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1d810 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1d820 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1d830 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1d840 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1d850 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1d860 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1d870 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1d880 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1d890 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1d8a0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1d8b0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1d8c0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1d8d0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1d8e0 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1d8f0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1d900 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1d910 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1d920 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1d930 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1d940 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1d950 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1d960 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1d970 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1d980 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1d990 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1d9a0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1d9b0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1d9c0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1d9d0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1d9e0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1d9f0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1da00 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1da10 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1da20 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1da30 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1da40 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1da50 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1da60 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1da70 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1da80 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1da90 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1daa0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1dab0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1dac0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1dad0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1dae0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1daf0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1db00 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1db10 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1db20 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1db30 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1db40 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1db50 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1db60 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1db70 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1db80 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1db90 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1dba0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dbb0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1dbc0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1dbd0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1dbe0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1dbf0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1dc00 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1dc10 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1dc20 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1dc30 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1dc40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1dc50 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1dc60 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1dc70 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1dc80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1dc90 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1dca0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1dcb0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1dcc0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1dcd0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1dce0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1dcf0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1dd00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1dd10 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1dd20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1dd30 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1dd40 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1dd50 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1dd60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1dd70 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1dd80 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1dd90 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1dda0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1ddb0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1ddc0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1ddd0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1dde0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1ddf0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1de00 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1de10 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1de20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1de30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1de40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1de50 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1de60 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1de70 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1de80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1de90 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1dea0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1deb0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1dec0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1ded0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1dee0 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1def0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1df00 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1df10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1df20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1df30 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1df40 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1df50 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1df60 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1df70 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1df80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1df90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1dfa0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1dfb0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1dfc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1dfd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dfe0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1dff0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e000 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e010 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e020 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e030 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e040 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e050 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e060 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e070 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e080 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e090 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e0a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e0b0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e0c0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e0d0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1e0e0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1e0f0 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1e100 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1e110 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1e120 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1e130 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1e140 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1e150 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1e160 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1e170 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e180 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1e190 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1e1a0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1e1b0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1e1c0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1e1d0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e1e0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1e1f0 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1e200 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1e210 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1e220 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1e230 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1e240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e250 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e260 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e270 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e280 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e2a0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e2b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e2c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1e2f0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1e300 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e310 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e320 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1e330 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1e340 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1e350 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1e360 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1e370 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1e380 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1e390 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1e3a0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1e3b0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1e3c0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1e3d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1e3e0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1e3f0 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1e400 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1e410 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1e420 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1e430 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e440 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1e450 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1e460 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1e470 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e480 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e490 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1e4a0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1e4b0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1e4c0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1e4d0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1e4e0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1e4f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1e500 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1e510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e520 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1e530 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1e540 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e550 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1e560 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1e570 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1e580 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1e590 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e5a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e5b0 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1e5c0 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1e5d0 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1e5e0 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1e5f0 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1e600 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1e610 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1e620 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1e630 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1e640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1e650 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1e660 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1e670 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1e680 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1e690 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1e6a0 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1e6b0 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1e6c0 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1e6d0 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1e6e0 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1e6f0 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1e700 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1e710 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1e720 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1e730 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1e740 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1e750 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1e760 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1e770 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e780 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1e790 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1e7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e7b0 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1e7c0 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1e7d0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1e7e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e7f0 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1e800 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1e810 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e840 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1e850 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e880 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1e890 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e8a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e8b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1e8c0 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ist */.#if defin
1e8d0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e8e0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e8f0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a  TE_CHECK_PAGES).
1e900 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1e930 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23   over pages */.#
1e940 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1e950 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1e960 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1e970 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1e980 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1e990 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1e9a0 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1e9b0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1e9c0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e9d0 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1e9e0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e9f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1ea00 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1ea10 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1ea20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1ea30 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1ea40 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1ea50 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1ea60 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1ea70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1ea80 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1ea90 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1eaa0 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1eab0 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1eac0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1ead0 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1eae0 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1eaf0 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1eb00 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1eb10 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1eb20 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1eb30 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1eb40 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1eb50 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1eb60 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64  Hdr *p;.    PgHd
1eb70 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1eb80 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1eb90 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1eba0 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1ebb0 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1ebc0 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1ebd0 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1ebe0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1ebf0 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1ec00 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1ec10 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1ec20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1ec30 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1ec40 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
1ec50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
1ec60 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
1ec70 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
1ec80 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1ec90 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1eca0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1ecb0 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1ecc0 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1ecd0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1ece0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1ecf0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1ed00 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1ed10 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
1ed20 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
1ed30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ed40 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
1ed50 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72  kup ){.    PgHdr
1ed60 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1ed70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1ed80 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
1ed90 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1eda0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1edb0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
1edc0 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
1edd0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
1ede0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1edf0 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1ee00 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1ee10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ee20 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  e);.  for(p=pLis
1ee30 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1ee40 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  y){.    pager_se
1ee50 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20  t_pagehash(p);. 
1ee60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1ee70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ee80 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
1ee90 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1eea0 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
1eeb0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
1eec0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
1eed0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
1eee0 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
1eef0 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
1ef00 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
1ef10 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
1ef20 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
1ef30 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
1ef40 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
1ef50 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
1ef60 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
1ef70 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
1ef80 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
1ef90 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
1efa0 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
1efb0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1efc0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
1efd0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
1efe0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1eff0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f010 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f020 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
1f030 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f040 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
1f050 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
1f060 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
1f070 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f080 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1f090 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f0a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
1f0b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f0c0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
1f0d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
1f0e0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f0f0 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
1f100 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
1f110 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
1f120 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
1f130 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
1f140 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
1f150 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
1f160 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f170 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
1f180 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
1f190 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
1f1a0 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
1f1b0 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
1f1c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1f1d0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f1e0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f1f0 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
1f200 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
1f210 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1f220 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
1f230 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ed);.  if( rc!=S
1f240 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e  QLITE_OK || chan
1f250 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
1f260 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1f270 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
1f280 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
1f290 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
1f2a0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
1f2b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f2c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f2d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f2e0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1f2f0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1f300 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1f310 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1f320 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1f330 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1f340 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f350 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1f360 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1f370 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1f380 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1f390 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1f3a0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1f3b0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1f3c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1f3d0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1f3e0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1f3f0 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1f400 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1f410 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1f420 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1f430 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1f440 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1f450 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1f460 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1f470 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f480 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1f490 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f4a0 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1f4b0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1f4e0 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1f4f0 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1f500 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f510 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1f520 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1f530 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1f540 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1f550 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1f560 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1f570 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1f580 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1f590 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f5a0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f5b0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1f5c0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1f5d0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f5e0 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f5f0 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1f600 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1f610 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1f620 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1f630 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1f640 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f650 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f660 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f670 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f680 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1f690 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1f6a0 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1f6b0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1f6c0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f6d0 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1f6e0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1f6f0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1f700 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1f710 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1f720 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f730 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1f740 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1f750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f760 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1f770 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1f780 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1f790 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1f7a0 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1f7b0 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1f7c0 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1f7d0 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1f7e0 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1f7f0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1f800 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1f810 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1f820 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1f830 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f840 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f850 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1f860 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1f870 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1f880 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1f890 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1f8a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1f8b0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1f8c0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f8d0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1f8e0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1f8f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f920 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1f930 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1f940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f950 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1f960 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1f970 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1f980 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1f990 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1f9a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f9b0 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1f9c0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1f9d0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1f9e0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1f9f0 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1fa00 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1fa10 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1fa20 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1fa30 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1fa40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1fa50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1fa60 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1fa70 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1fa80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1fa90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1faa0 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1fab0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fac0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1fad0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fae0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1faf0 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1fb00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1fb10 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1fb20 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1fb30 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1fb40 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1fb50 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1fb60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1fb70 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1fb80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1fb90 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1fba0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1fbb0 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1fbc0 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1fbd0 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1fbe0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1fbf0 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1fc00 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1fc10 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1fc20 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1fc30 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1fc40 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1fc50 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1fc60 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1fc70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1fc80 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1fc90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1fca0 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1fcb0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1fcc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fcd0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1fce0 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1fcf0 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1fd00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1fd10 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1fd20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1fd30 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1fd40 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1fd50 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1fd60 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1fd70 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1fd80 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1fd90 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1fda0 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1fdb0 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1fdc0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1fdd0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1fde0 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1fdf0 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1fe00 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1fe10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fe20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fe30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1fe40 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1fe50 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1fe60 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
1fe70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
1fe80 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
1fe90 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1feb0 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
1fec0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
1fed0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fef0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ff00 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1ff10 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
1ff20 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1ff30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ff40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ff50 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1ff60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1ff70 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
1ff80 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
1ff90 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
1ffa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ffb0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
1ffc0 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
1ffd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
1ffe0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1fff0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
20000 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
20010 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
20020 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
20030 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
20040 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
20050 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
20060 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20080 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
20090 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
200a0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
200b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
200c0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
200d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
200e0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
200f0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
20100 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
20110 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
20120 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20130 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
20140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20150 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20160 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
20170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20180 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20190 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
201a0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
201b0 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
201c0 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
201d0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
201e0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
201f0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
20200 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
20210 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20220 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
20230 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
20240 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
20250 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20260 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20270 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20280 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20290 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
202a0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
202b0 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
202c0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
202d0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
202e0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
202f0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
20300 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
20310 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
20320 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
20330 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
20340 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
20350 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20360 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20370 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20380 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20390 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
203a0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
203b0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
203c0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
203d0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
203e0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
203f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20400 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
20410 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20420 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
20430 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
20440 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20450 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20460 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20470 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20480 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20490 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
204a0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
204b0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
204c0 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
204d0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
204e0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
204f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20500 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
20510 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
20520 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
20530 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20540 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
20550 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20560 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20570 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20580 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20590 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
205a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
205b0 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
205c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
205d0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
205e0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
205f0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
20600 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
20610 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
20620 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20630 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20640 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20650 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20660 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20670 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20680 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20690 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
206a0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
206b0 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
206c0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
206d0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
206e0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
206f0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
20700 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
20710 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
20720 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
20730 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
20740 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
20750 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20760 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20770 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20780 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20790 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
207a0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
207b0 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
207c0 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
207d0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
207e0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
207f0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
20800 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
20810 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
20820 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
20830 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
20840 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
20850 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20860 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20870 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20880 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20890 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
208a0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
208b0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
208c0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
208d0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
208e0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
208f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
20900 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
20910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
20920 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
20930 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
20940 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
20950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20960 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20970 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20980 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20990 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
209a0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
209b0 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
209c0 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
209d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
209e0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
209f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20a00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20a10 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
20a20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20a30 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20a40 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
20a50 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20a60 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20a70 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20a80 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20a90 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20aa0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20ab0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20ac0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20ad0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20ae0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20af0 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
20b00 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
20b10 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
20b20 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
20b30 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
20b40 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
20b50 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
20b60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
20b70 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
20b80 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
20b90 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20ba0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20bb0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20bc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20bd0 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
20be0 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
20bf0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20c00 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
20c10 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
20c20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
20c30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20c40 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
20c50 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20c60 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
20c70 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
20c80 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
20c90 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
20ca0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20cb0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20cc0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
20cd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
20ce0 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
20cf0 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
20d00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20d10 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
20d20 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
20d30 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
20d40 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
20d50 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
20d60 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
20d70 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
20d80 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
20d90 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
20da0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20db0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20dc0 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
20dd0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20de0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
20df0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
20e00 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
20e10 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
20e20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
20e30 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
20e40 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
20e50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
20e60 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
20e70 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
20e80 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
20e90 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
20ea0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20eb0 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20ec0 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20ed0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20ee0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20ef0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20f00 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
20f10 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20f20 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
20f30 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20f40 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
20f50 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
20f60 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
20f70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
20f80 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
20f90 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
20fa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20fb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20fc0 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
20fd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20fe0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20ff0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
21000 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
21010 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
21020 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21030 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
21050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21060 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
21070 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
21080 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
21090 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
210a0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
210b0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
210c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
210d0 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
210e0 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
210f0 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
21100 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21110 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
21120 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
21130 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21140 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
21150 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
21160 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
21170 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
21180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21190 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
211a0 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
211b0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
211c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
211d0 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
211e0 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
211f0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
21200 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
21210 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
21220 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
21230 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
21240 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
21250 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
21260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21270 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
21280 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
21290 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
212a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
212b0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
212c0 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
212d0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
212e0 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
212f0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
21300 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
21310 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
21320 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
21330 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
21340 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
21350 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
21360 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
21370 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21380 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21390 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
213a0 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
213b0 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
213c0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
213d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
213e0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
213f0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
21400 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
21410 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
21420 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
21430 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
21440 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
21450 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21460 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21470 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21480 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21490 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
214a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
214b0 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
214c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
214d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
214e0 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
214f0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
21500 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
21510 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21520 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
21530 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
21540 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
21550 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
21560 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
21570 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
21580 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
21590 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
215a0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
215b0 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
215c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
215d0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
215e0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
215f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21600 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
21610 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
21620 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
21630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21640 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
21650 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21660 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21670 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
21680 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
21690 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
216a0 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
216b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
216c0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
216d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
216e0 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
216f0 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
21700 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
21710 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
21720 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
21730 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
21740 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
21750 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
21760 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
21770 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21780 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21790 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
217a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
217b0 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
217c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217d0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
217e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
217f0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
21800 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
21810 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21820 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
21830 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
21840 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
21850 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21860 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
21870 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21880 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
21890 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
218a0 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
218b0 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
218c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
218d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
218e0 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20  P_SIZE based on 
218f0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
21900 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a  e of szMmap..*/.
21910 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
21920 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67  rFixMaplimit(Pag
21930 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
21940 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21950 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65  _SIZE>0.  sqlite
21960 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
21970 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69  ger->fd;.  if( i
21980 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d  sOpen(fd) && fd-
21990 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
219a0 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71  ion>=3 ){.    sq
219b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
219c0 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d      sz = pPager-
219d0 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61  >szMmap;.    pPa
219e0 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d  ger->bUseFetch =
219f0 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c   (sz>0);.    sql
21a00 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
21a10 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
21a20 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
21a30 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
21a40 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
21a50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21a60 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
21a70 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ny memory mappin
21a80 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61  g made of the da
21a90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
21aa0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21ab0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61  rSetMmapLimit(Pa
21ac0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
21ad0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
21ae0 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a  p){.  pPager->sz
21af0 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
21b00 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
21b10 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
21b20 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68  .** Free as much
21b30 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
21b40 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
21b50 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
21b60 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50  te3PagerShrink(P
21b70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21b80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
21b90 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  rink(pPager->pPC
21ba0 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
21bb0 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20  Adjust settings 
21bc0 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  of the pager to 
21bd0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
21be0 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20 70  in the pgFlags p
21bf0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
21c00 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70  The "level" in p
21c10 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
21c20 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20  YNCHRONOUS_MASK 
21c30 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e  sets the robustn
21c40 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ess.** of the da
21c50 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
21c60 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
21c70 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  es or power fail
21c80 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67  ures by.** chang
21c90 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
21ca0 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
21cb0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
21cc0 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61  nals..** There a
21cd0 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
21ce0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
21cf0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
21d00 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
21d10 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
21d20 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
21d30 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
21d40 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
21d50 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
21d60 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
21d70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
21d80 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
21d90 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
21da0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
21db0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
21dc0 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
21dd0 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
21de0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
21df0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
21e00 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
21e10 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
21e20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
21e30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
21e40 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
21e50 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
21e60 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
21e70 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
21e80 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
21e90 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
21ea0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
21eb0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
21ed0 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
21ee0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
21ef0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
21f00 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
21f10 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
21f20 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
21f40 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
21f50 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
21f60 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
21f70 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
21f80 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
21f90 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21fa0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
21fb0 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
21fc0 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
21fd0 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
21fe0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
21ff0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
22000 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
22010 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
22020 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
22030 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
22050 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
22060 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
22070 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
22080 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
22090 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
220a0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
220b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
220c0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
220d0 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
220e0 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
220f0 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
22100 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
22110 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
22120 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
22130 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
22140 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
22150 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
22160 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
22170 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
22180 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
22190 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
221a0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
221b0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
221c0 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
221d0 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
221e0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
221f0 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
22200 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
22210 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
22220 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
22230 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
22240 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
22250 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
22260 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
22270 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
22280 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
22290 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
222a0 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
222b0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
222c0 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
222d0 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
222e0 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a  d with NORMAL..*
222f0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
22300 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
22310 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
22320 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
22330 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
22340 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
22350 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
22360 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
22370 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
22380 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
22390 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
223a0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
223b0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
223c0 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
223d0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
223e0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
223f0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
22400 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
22410 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
22420 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
22430 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
22440 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
22450 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
22460 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
22470 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
22480 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
22490 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
224a0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
224b0 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
224c0 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
224d0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
224e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
224f0 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
22500 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
22510 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
22520 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22530 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
22540 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
22550 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
22560 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
22570 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
22580 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
22590 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
225a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
225b0 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72  lags      /* Var
225c0 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ious flags */.){
225d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65  .  unsigned leve
225e0 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41  l = pgFlags & PA
225f0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22600 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  MASK;.  assert( 
22610 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65  level>=1 && leve
22620 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72  l<=3 );.  pPager
22630 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
22640 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
22650 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
22660 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
22670 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
22680 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
22690 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66  File) ?1:0;.  if
226a0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
226b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
226c0 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  syncFlags = 0;. 
226d0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
226e0 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
226f0 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
22700 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53  s & PAGER_FULLFS
22710 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
22720 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22730 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22740 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22750 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
22760 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
22770 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22780 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f  gs & PAGER_CKPT_
22790 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
227a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
227b0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
227c0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
227d0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
227e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
227f0 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _FULL;.  }else{.
22800 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22810 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22820 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
22830 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22840 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22850 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
22860 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
22870 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d  cFlags = pPager-
22880 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66  >syncFlags;.  if
22890 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
228a0 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
228b0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c  ->walSyncFlags |
228c0 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  = WAL_SYNC_TRANS
228d0 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69  ACTIONS;.  }.  i
228e0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
228f0 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b  ER_CACHESPILL ){
22900 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
22910 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
22920 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LFLAG_OFF;.  }el
22930 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22940 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
22950 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
22960 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22970 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
22980 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
22990 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
229a0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
229b0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
229c0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
229d0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
229e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
229f0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
22a00 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
22a10 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
22a20 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
22a30 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
22a40 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
22a50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
22a60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
22a70 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
22a80 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
22a90 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
22aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22ab0 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
22ac0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
22ad0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
22ae0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
22af0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
22b00 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
22b10 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
22b20 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
22b30 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
22b40 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
22b50 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
22b60 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
22b70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
22b80 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
22b90 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
22ba0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
22bb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22bc0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
22bd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
22be0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
22bf0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
22c00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22c10 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22c20 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
22c30 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
22c40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22c60 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
22c70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22c80 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
22c90 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22ca0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
22cb0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
22cc0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
22cd0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
22ce0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
22cf0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22d00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22d10 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
22d20 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
22d30 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22d40 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
22d50 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
22d60 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
22d70 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
22d80 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
22d90 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
22da0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
22db0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
22dc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
22dd0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
22de0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22df0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
22e00 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
22e10 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
22e20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
22e30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22e40 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
22e50 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
22e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22e70 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
22e80 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
22e90 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
22ea0 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
22eb0 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
22ec0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
22ed0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
22ee0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
22ef0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
22f00 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
22f10 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
22f20 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
22f30 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
22f40 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
22f50 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
22f60 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
22f70 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
22f80 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
22f90 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
22fa0 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
22fb0 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
22fc0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
22fd0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
22fe0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
22ff0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
23000 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
23010 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
23020 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
23050 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
23060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23090 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
230a0 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
230b0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
230c0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
230d0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
230e0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
230f0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
23100 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
23110 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
23120 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
23130 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
23140 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
23150 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
23160 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
23170 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
23180 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
23190 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
231a0 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
231b0 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
231c0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
231d0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
231e0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
231f0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
23200 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23210 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
23220 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
23230 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
23240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
23250 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
23260 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
23270 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
23280 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
23290 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
232a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
232b0 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
232c0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
232d0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
232e0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
232f0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50  ndler */.){.  pP
23300 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
23310 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
23320 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
23330 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
23340 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
23350 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
23360 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
23370 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f   void **ap = (vo
23380 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78  id **)&pPager->x
23390 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
233a0 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a   assert( ((int(*
233b0 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d  )(void *))(ap[0]
233c0 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72  ))==xBusyHandler
233d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
233e0 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64  ap[1]==pBusyHand
233f0 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71  lerArg );.    sq
23400 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
23410 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
23420 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
23430 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f  BUSYHANDLER, (vo
23440 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a  id *)ap);.  }.}.
23450 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
23460 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
23470 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
23480 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
23490 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
234a0 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
234b0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
234c0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
234d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
234e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
234f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
23500 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
23510 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
23520 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
23530 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
23540 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
23550 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e  SQLITE_IOERR, an
23560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78   SQLITE_IOERR_xx
23570 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51  x sub-code or SQ
23580 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
23590 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
235a0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
235b0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
235c0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
235d0 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
235e0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
235f0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
23600 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
23610 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
23620 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
23630 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
23640 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
23650 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
23660 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23670 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
23680 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
23690 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
236a0 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
236b0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
236c0 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
236d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
236e0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
236f0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
23700 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
23710 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
23720 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
23730 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
23740 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23750 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
23760 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
23770 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
23780 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
23790 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
237a0 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
237b0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
237c0 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
237d0 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
237e0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
237f0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
23800 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
23810 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
23820 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
23830 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
23840 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23850 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23860 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
23870 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
23880 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
23890 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
238a0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
238b0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
238c0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
238d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
238e0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
238f0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
23900 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
23910 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
23920 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
23930 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
23940 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
23950 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
23960 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
23970 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
23980 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
23990 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
239a0 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70   *pPager, u32 *p
239b0 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
239c0 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
239d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
239e0 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
239f0 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20  ossible to do a 
23a00 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65  full assert_page
23a10 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20  r_state() here, 
23a20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  as this.  ** fun
23a30 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
23a40 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
23a50 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66  PagerOpen(), bef
23a60 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20  ore the state.  
23a70 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  ** of the Pager 
23a80 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e  object is intern
23a90 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
23aa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e  .  **.  ** At on
23ab0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e  e point this fun
23ac0 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61  ction returned a
23ad0 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70  n error if the p
23ae0 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  ager was in .  *
23af0 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  * PAGER_ERROR st
23b00 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50  ate. But since P
23b10 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
23b20 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
23b30 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
23b40 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
23b50 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23b60 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e  erence, this fun
23b70 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20  ction.  ** is a 
23b80 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63  no-op for that c
23b90 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ase anyhow..  */
23ba0 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65  ..  u32 pageSize
23bb0 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
23bc0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
23bd0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
23be0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
23bf0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
23c00 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
23c10 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
23c20 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
23c30 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26  dbSize==0).   &&
23c40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
23c50 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
23c60 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26  PCache)==0 .   &
23c70 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
23c80 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61  geSize!=(u32)pPa
23c90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
23ca0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
23cb0 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ew = NULL;      
23cc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65         /* New te
23cd0 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  mp space */.    
23ce0 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a  i64 nByte = 0;..
23cf0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23d00 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45  eState>PAGER_OPE
23d10 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  N && isOpen(pPag
23d20 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
23d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
23d40 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
23d50 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  fd, &nByte);.   
23d60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23d80 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a    pNew = (char *
23d90 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
23da0 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
23db0 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20      if( !pNew ) 
23dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
23dd0 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
23de0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23df0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
23e00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
23e10 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
23e20 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
23e30 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
23e40 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23e50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23e60 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
23e70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
23e80 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
23e90 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
23ea0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
23eb0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71 6c   pNew;.      sql
23ec0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
23ed0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
23ee0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
23ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
23f00 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
23f10 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
23f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23f30 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
23f40 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
23f50 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
23f60 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
23f70 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
23f80 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
23f90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
23fa0 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
23fb0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
23fc0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
23fd0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
23fe0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
23ff0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
24000 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24010 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
24020 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
24030 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
24040 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
24050 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
24060 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
24070 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
24080 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
24090 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
240a0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
240b0 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
240c0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
240d0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
240e0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
240f0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
24100 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
24110 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
24120 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
24130 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
24140 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
24150 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
24160 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
24170 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
24180 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
24190 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
241a0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
241b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
241c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
241d0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
241e0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
241f0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
24200 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
24210 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
24220 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
24230 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
24240 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
24250 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
24260 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
24270 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
24280 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
24290 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
242a0 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
242b0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
242c0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
242d0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
242e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
242f0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
24300 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
24310 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
24320 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
24330 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
24340 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
24350 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24360 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
24370 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
24380 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
24390 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
243a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
243b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
243c0 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
243d0 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
243e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
243f0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
24400 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
24410 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
24420 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
24430 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
24440 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
24450 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
24460 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
24470 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
24480 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
24490 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
244a0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
244b0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
244c0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
244d0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
244e0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
244f0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
24500 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
24510 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
24520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
24530 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
24540 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24550 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
24560 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
24570 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
24580 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
24590 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
245a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
245b0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
245c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
245d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
245e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
245f0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
24600 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
24610 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24620 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
24630 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24640 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
24650 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
24660 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
24670 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
24680 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
24690 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
246a0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
246b0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
246c0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
246d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
246e0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
246f0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
24700 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
24710 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
24720 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
24730 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
24740 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
24750 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
24760 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
24770 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
24780 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
24790 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
247a0 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
247b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
247c0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
247d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
247e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
247f0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
24800 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
24810 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
24820 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
24830 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
24840 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
24850 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
24860 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
24870 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
24880 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
24890 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
248a0 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
248b0 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
248c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
248d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
248e0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
248f0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
24900 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
24910 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
24920 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
24930 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
24940 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
24950 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
24960 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
24970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
24980 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
24990 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
249a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
249b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
249c0 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
249d0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
249e0 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
249f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
24a00 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
24a10 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
24a20 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
24a30 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
24a40 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
24a50 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
24a60 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
24a70 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
24a80 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
24a90 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
24aa0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
24ab0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
24ac0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
24ad0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
24ae0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
24af0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
24b00 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
24b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
24b20 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
24b30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24b40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
24b50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24b60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24b70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
24b80 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
24b90 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
24ba0 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
24bb0 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
24bc0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
24bd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
24be0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24bf0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
24c00 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
24c10 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
24c20 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
24c30 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
24c40 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
24c50 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
24c60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24c70 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
24c80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24c90 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
24ca0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
24cb0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
24cc0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
24cd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24ce0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
24cf0 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
24d00 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
24d10 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
24d20 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
24d30 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
24d40 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
24d50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24d60 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
24d70 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
24d80 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
24d90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24da0 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
24db0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
24dc0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
24dd0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
24de0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
24df0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
24e00 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
24e10 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
24e20 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
24e30 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
24e40 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
24e50 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
24e60 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
24e70 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
24e80 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
24e90 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
24ea0 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
24eb0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
24ec0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
24ed0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
24ee0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
24ef0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
24f00 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
24f10 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
24f20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
24f30 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
24f40 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
24f50 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
24f60 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
24f70 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
24f80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
24f90 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
24fa0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
24fb0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
24fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24fe0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24ff0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
25000 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
25010 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
25020 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
25030 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
25040 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f  ready held, or o
25050 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
25060 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  stions that the 
25070 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
25080 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
25090 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
250a0 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
250b0 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
250c0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
250d0 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
250e0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
250f0 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
25100 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
25110 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
25120 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25130 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
25140 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25150 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
25160 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
25170 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
25180 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
25190 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
251a0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
251b0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
251c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
251d0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
251e0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
251f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
25200 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
25210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
25220 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
25230 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25240 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
25250 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
25260 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
25270 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
25280 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
25290 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
252a0 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
252b0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
252c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
252d0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
252e0 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
252f0 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
25300 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
25310 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
25320 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
25330 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
25340 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
25350 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
25360 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
25370 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
25380 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
25390 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
253a0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
253b0 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
253c0 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
253d0 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
253e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
253f0 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
25400 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
25410 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
25420 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
25430 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
25440 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
25450 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
25460 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
25470 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
25480 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
25490 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
254a0 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
254b0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
254c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
254d0 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
254e0 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
254f0 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
25500 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
25510 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
25520 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
25530 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
25540 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
25550 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
25560 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
25570 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
25580 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
25590 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
255a0 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
255b0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
255c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
255d0 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
255e0 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
255f0 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
25600 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
25610 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
25620 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
25630 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
25640 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
25650 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
25660 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
25670 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
25680 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
25690 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
256a0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
256b0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
256c0 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
256d0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
256e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
256f0 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
25700 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
25710 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
25720 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
25730 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
25740 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25750 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25760 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
25770 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
25780 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
25790 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
257a0 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
257b0 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
257c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
257d0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
257e0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
257f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
25800 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
25810 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
25820 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
25830 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
25840 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
25850 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
25860 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
25870 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
25880 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
25890 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
258a0 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
258b0 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
258c0 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
258d0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
258e0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
258f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
25900 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
25910 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25920 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
25930 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
25940 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
25950 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
25960 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
25970 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
25980 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
25990 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
259a0 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
259b0 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
259c0 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
259d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
259e0 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
259f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
25a00 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
25a10 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
25a20 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
25a30 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
25a40 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
25a50 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
25a60 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
25a70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25a80 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
25a90 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
25aa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25ab0 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
25ac0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
25ad0 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
25ae0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25af0 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
25b00 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
25b10 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
25b20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
25b30 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
25b40 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
25b50 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
25b60 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
25b70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
25b80 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
25b90 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
25ba0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
25bb0 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
25bc0 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
25bd0 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
25be0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
25bf0 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
25c00 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
25c10 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
25c20 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
25c30 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
25c40 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
25c50 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
25c60 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
25c70 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
25c80 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
25c90 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
25ca0 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
25cb0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
25cc0 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
25cd0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25ce0 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
25cf0 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
25d00 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
25d10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25d20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
25d30 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
25d40 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
25d50 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
25d60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
25d70 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
25d80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25d90 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
25da0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
25db0 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
25dc0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
25dd0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
25de0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
25df0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
25e00 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
25e10 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
25e20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
25e30 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
25e40 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
25e50 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
25e60 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
25e70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
25e80 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
25e90 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
25ea0 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
25eb0 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
25ec0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
25ed0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
25ee0 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
25ef0 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
25f00 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
25f10 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
25f20 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
25f30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25f40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
25f50 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
25f60 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
25f70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
25f80 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
25f90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25fa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25fb0 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
25fc0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
25fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
25fe0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
25ff0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
26000 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
26010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26030 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
26040 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
26050 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
26060 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26070 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
26080 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
26090 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
260a0 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
260b0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
260c0 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
260d0 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
260e0 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
260f0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
26100 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
26110 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
26120 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
26130 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
26140 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
26150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26160 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
26170 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
26180 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
26190 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
261a0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
261b0 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
261c0 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
261d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
261e0 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
261f0 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
26200 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26210 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
26220 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
26230 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
26240 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
26250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26260 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
26270 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26290 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
262a0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
262d0 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
262e0 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
262f0 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
26300 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26310 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
26320 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
26330 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26350 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
26360 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
26370 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
26380 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
26390 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
263a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
263b0 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
263c0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
263d0 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
263e0 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
263f0 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   0;.    memset(p
26400 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
26410 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
26420 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
26430 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
26440 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
26450 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
26460 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
26470 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
26480 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26490 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
264a0 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
264b0 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
264c0 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
264d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
264e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
264f0 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
26500 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
26510 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
26520 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
26530 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
26540 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
26550 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
26560 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
26570 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
26580 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26590 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
265a0 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
265b0 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
265c0 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
265d0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
265e0 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
265f0 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
26600 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
26610 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
26620 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
26630 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26640 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
26650 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
26660 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
26670 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
26680 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
26690 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
266a0 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
266b0 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
266c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
266d0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
266e0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
266f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26700 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
26710 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
26720 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
26730 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26740 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
26750 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26760 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
26770 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
26780 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
26790 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
267a0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
267b0 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
267c0 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
267d0 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
267e0 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
267f0 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
26800 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
26810 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
26820 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
26830 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26840 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26850 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26860 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
26870 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
26880 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
26890 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
268a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
268b0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
268c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
268d0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
268e0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
268f0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
26900 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
26910 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
26920 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
26930 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
26940 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
26950 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26960 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
26970 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
26980 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
26990 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
269a0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
269b0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
269c0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
269d0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
269e0 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
269f0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
26a00 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
26a10 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
26a20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
26a30 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
26a40 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
26a50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26a60 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
26a70 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
26a80 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
26a90 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
26aa0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
26ab0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
26ac0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
26ad0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
26ae0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
26af0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
26b00 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
26b10 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
26b20 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
26b30 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
26b40 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
26b50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26b60 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
26b70 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
26b80 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
26b90 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
26ba0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
26bb0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
26bc0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
26bd0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
26be0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
26bf0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26c00 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
26c10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
26c20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
26c30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
26c40 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
26c50 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
26c60 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
26c70 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
26c80 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
26c90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26ca0 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
26cb0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
26cc0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
26cd0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
26ce0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
26cf0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
26d00 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
26d10 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
26d20 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
26d30 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
26d40 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
26d50 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
26d60 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
26d70 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
26d80 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
26d90 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
26da0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
26db0 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
26dc0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
26dd0 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
26de0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
26df0 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
26e00 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
26e10 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
26e20 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
26e30 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
26e40 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
26e50 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
26e60 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
26e70 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
26e80 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
26e90 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
26ea0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
26eb0 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
26ec0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
26ed0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
26ee0 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
26ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
26f00 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
26f10 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
26f20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
26f30 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
26f40 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
26f50 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
26f60 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
26f70 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
26f80 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
26f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
26fa0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
26fb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26fc0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
26fd0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
26fe0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
26ff0 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
27000 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
27010 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
27020 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
27030 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27040 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
27050 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
27060 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
27070 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
27080 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27090 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
270a0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
270b0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
270c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
270d0 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
270e0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
270f0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
27100 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
27110 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
27120 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
27130 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27140 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
27150 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
27160 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
27170 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
27180 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
27190 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
271a0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
271b0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
271c0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
271d0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
271e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
271f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27200 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27210 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
27220 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27230 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27240 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
27250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
27260 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
27270 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
27280 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
27290 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
272a0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
272b0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
272c0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
272d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
272e0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
272f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27300 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27310 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27320 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27330 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27340 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27350 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27360 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
27370 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27380 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27390 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
273a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
273b0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
273c0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
273d0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
273e0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
273f0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27400 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27410 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27420 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27430 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27440 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27450 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27460 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
27470 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
27480 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
27490 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
274a0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
274b0 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
274c0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
274d0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
274e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
274f0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
27500 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
27510 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
27520 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
27530 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27540 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27550 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27560 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27570 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27580 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
27590 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
275a0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
275b0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
275c0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
275d0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
275e0 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
275f0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
27600 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
27610 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
27620 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
27630 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27640 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27650 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27660 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
27670 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27690 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
276a0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
276b0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
276c0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
276d0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
276e0 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
276f0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
27700 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
27710 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
27720 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
27730 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27740 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27750 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27760 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27770 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27780 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27790 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
277a0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
277b0 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
277c0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
277d0 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
277e0 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
277f0 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
27800 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
27810 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
27820 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
27830 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
27840 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27850 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
27860 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
27870 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27880 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27890 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
278a0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
278b0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
278c0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
278d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
278e0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
278f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
27900 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
27910 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
27920 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27950 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
27960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27970 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27980 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27990 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
279a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
279b0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
279c0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
279d0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
279e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
279f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27a00 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
27a10 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
27a20 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
27a30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27a40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27a50 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
27a60 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
27a70 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27a80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
27a90 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27aa0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27ab0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27ac0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27ad0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
27ae0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
27af0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
27b00 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
27b10 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
27b20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27b30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27b40 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
27b50 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
27b60 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
27b70 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
27b80 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
27b90 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
27ba0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
27bb0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
27bc0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
27bd0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
27be0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
27bf0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
27c00 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
27c10 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
27c20 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27c30 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
27c40 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
27c50 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
27c60 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
27c70 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
27c80 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
27c90 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
27ca0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
27cb0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
27cc0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
27cd0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
27ce0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
27cf0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
27d00 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
27d10 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
27d20 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
27d30 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
27d40 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
27d50 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
27d60 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
27d70 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
27d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
27d90 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
27da0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
27db0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
27dc0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
27dd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
27de0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
27df0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
27e00 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
27e10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
27e20 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27e30 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
27e40 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
27e50 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
27e60 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
27e70 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
27e80 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
27e90 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
27ea0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
27eb0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
27ec0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
27ed0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
27ee0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
27ef0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
27f00 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
27f10 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
27f20 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
27f30 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
27f40 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
27f50 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
27f60 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
27f70 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
27f80 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
27f90 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
27fa0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
27fb0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
27fc0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
27fd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27fe0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
27ff0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
28000 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
28010 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
28020 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
28030 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28040 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
28050 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
28060 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
28070 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
28080 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
28090 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
280a0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
280b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
280c0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
280d0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
280e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
280f0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
28100 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
28110 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
28120 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
28130 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28140 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
28150 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
28160 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
28170 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28180 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
28190 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
281a0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
281b0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
281c0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
281d0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
281e0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
281f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28210 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
28220 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
28230 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28240 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28250 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
28260 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
28270 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
28280 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
28290 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
282a0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
282b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
282c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
282d0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
282e0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
282f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28300 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28310 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28320 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28330 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28340 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28350 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28360 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
28370 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28380 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28390 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
283a0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
283b0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
283c0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
283d0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
283e0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
283f0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28400 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28410 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28420 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28430 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28440 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28450 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28460 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28470 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
28480 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
28490 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
284a0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
284b0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
284c0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
284d0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
284e0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
284f0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
28500 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
28510 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
28520 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
28530 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28540 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28550 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28560 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
28570 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
28580 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
28590 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
285a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
285b0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
285c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
285d0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
285e0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
285f0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28600 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
28610 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
28620 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28630 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28640 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28650 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28660 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28670 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28680 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28690 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
286a0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
286b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
286c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
286d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
286e0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
286f0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
28700 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
28710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
28720 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28730 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28740 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28750 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28760 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28770 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28780 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28790 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
287a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
287b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
287c0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
287d0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
287e0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
287f0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28800 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28810 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28820 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28830 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28840 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28850 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
28860 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28870 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28880 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28890 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
288a0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
288b0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
288c0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
288d0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
288e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
288f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28900 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28910 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
28920 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28940 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
28950 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
28960 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
28970 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28980 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
28990 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
289a0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
289b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
289c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
289d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
289e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
289f0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
28a00 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28a10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28a20 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
28a30 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
28a40 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
28a50 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
28a60 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
28a70 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
28a80 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
28a90 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
28aa0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28ab0 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
28ac0 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
28ad0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28ae0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
28af0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
28b00 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
28b10 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
28b20 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
28b30 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28b40 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
28b70 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
28b80 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
28b90 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
28ba0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
28bb0 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
28bc0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
28bd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
28be0 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
28bf0 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
28c00 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
28c10 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
28c20 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
28c30 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
28c40 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
28c50 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
28c60 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
28c70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28c80 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
28c90 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
28ca0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
28cb0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
28cc0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
28cd0 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
28ce0 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
28cf0 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
28d00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
28d10 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
28d20 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
28d30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
28d40 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
28d50 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
28d60 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
28d70 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
28d80 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
28d90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28da0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
28db0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
28dc0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
28dd0 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
28de0 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
28df0 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
28e00 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
28e10 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
28e20 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
28e30 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
28e40 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
28e50 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
28e60 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
28e70 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
28e80 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
28e90 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
28ea0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
28eb0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
28ec0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
28ed0 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
28ee0 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
28ef0 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
28f00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
28f10 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
28f20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28f30 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
28f40 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
28f50 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
28f60 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
28f70 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
28f80 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
28f90 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
28fa0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
28fb0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
28fc0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
28fd0 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
28fe0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
28ff0 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
29000 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
29010 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
29020 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
29030 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
29040 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
29050 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
29060 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
29070 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
29080 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
29090 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
290a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
290b0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
290c0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
290d0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
290e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
290f0 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
29100 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
29110 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
29120 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29130 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29140 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
29150 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
29160 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
29170 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
29180 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
291b0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
291c0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
291d0 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
291e0 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
291f0 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
29200 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
29210 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29220 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29230 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29240 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
29250 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29260 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
29270 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
29280 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
29290 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
292a0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
292b0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
292c0 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
292d0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
292e0 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
292f0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
29300 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
29310 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
29320 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
29330 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
29340 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
29350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
29360 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29370 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29380 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29390 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
293a0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
293b0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
293c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
293d0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
293e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
293f0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
29400 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
29410 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
29420 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
29430 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
29440 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
29450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29460 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
29470 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
29480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
29490 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69   && pPager->dbHi
294a0 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  ntSize<pPager->d
294b0 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69  bSize.   && (pLi
294c0 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c  st->pDirty || pL
294d0 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  ist->pgno>pPager
294e0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20  ->dbHintSize).  
294f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
29500 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
29510 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
29520 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29530 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29540 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
29550 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
29560 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
29570 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
29580 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
29590 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
295a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
295b0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
295c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
295d0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
295e0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
295f0 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
29600 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
29610 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
29620 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
29630 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
29640 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
29650 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29660 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
29670 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
29680 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
29690 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
296a0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
296b0 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
296c0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
296d0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
296e0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
296f0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
29700 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
29710 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
29720 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
29730 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
29740 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29750 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
29760 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
29770 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
29780 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29790 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
297a0 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
297b0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
297c0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
297d0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
297e0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
297f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29800 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
29810 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
29820 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29850 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
29860 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
29870 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
29880 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29890 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
298a0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
298b0 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
298c0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
298d0 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
298e0 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
298f0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
29900 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
29910 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
29920 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
29930 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
29940 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
29950 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
29960 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
29970 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29980 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
29990 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
299a0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
299b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
299c0 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
299d0 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
299e0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
299f0 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
29a00 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
29a10 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
29a20 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
29a30 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
29a40 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
29a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29a60 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
29a70 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
29a80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29a90 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
29aa0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
29ab0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
29ac0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
29ad0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
29ae0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
29af0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
29b00 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
29b10 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
29b20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29b30 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
29b40 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29b50 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
29b60 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
29b70 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
29b80 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
29b90 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
29ba0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
29bb0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
29bc0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
29bd0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
29be0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
29bf0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
29c00 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29c10 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29c20 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29c50 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
29c60 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
29c70 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
29c80 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
29c90 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
29ca0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
29cb0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
29cc0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
29cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29ce0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29cf0 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
29d00 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29d10 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
29d20 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
29d30 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
29d40 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
29d50 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
29d60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
29d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
29d80 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
29d90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
29da0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
29db0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
29dc0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
29dd0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
29de0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29df0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
29e00 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
29e10 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
29e20 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
29e30 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
29e40 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
29e50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
29e60 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
29e70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
29e80 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
29e90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29ea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29eb0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
29ec0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
29ed0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
29ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29ef0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
29f00 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
29f10 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
29f20 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
29f30 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
29f40 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
29f50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29f60 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
29f70 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
29f80 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
29f90 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
29fa0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
29fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29fc0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
29fd0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
29fe0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
29ff0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
2a000 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
2a010 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
2a020 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
2a030 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
2a040 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
2a050 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
2a060 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
2a070 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
2a080 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2a090 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a0a0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2a0b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2a0c0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2a0d0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2a0e0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2a0f0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2a100 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2a110 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a120 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2a130 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2a140 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2a150 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2a160 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2a170 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2a180 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2a190 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2a1a0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2a1b0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2a1c0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2a1d0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2a1e0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2a1f0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2a200 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2a210 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a220 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2a230 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2a240 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2a250 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a260 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a270 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2a280 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2a290 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2a2a0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2a2b0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2a2c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2a2d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2a2e0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a2f0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2a300 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a310 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a320 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a330 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2a340 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2a350 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2a360 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2a370 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2a380 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2a390 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2a3a0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2a3b0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2a3c0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2a3d0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2a3e0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2a3f0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2a400 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2a410 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2a420 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2a430 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2a440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2a450 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2a460 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2a470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a480 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2a490 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2a4a0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a4b0 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2a4c0 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2a4d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a4e0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2a4f0 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2a500 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2a510 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2a520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a530 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
2a540 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a550 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2a560 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a570 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a580 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a590 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2a5a0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2a5b0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2a5c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a5d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a5e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a5f0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a600 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2a610 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a620 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2a630 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a650 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2a660 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2a670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a680 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2a690 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2a6a0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a6b0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2a6c0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2a6d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2a6e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a6f0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2a700 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2a710 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2a720 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2a730 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2a740 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2a750 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2a760 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2a770 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2a780 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2a790 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2a7a0 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2a7b0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2a7c0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2a7d0 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2a7e0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2a7f0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2a800 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2a810 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2a820 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2a830 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2a840 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2a850 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2a860 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2a870 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2a880 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2a890 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2a8a0 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2a8b0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2a8c0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2a8d0 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2a8e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2a8f0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2a900 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2a910 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2a920 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2a930 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a940 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2a950 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2a960 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2a970 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2a980 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2a990 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2a9a0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2a9b0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2a9c0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2a9d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2a9e0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2a9f0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2aa00 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2aa10 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2aa20 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2aa30 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2aa40 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2aa50 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2aa60 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2aa70 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2aa80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2aa90 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2aaa0 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2aab0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2aac0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2aad0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2aae0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2aaf0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2ab00 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2ab10 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ab20 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2ab30 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2ab40 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2ab50 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2ab60 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2ab70 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2ab80 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2ab90 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2aba0 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2abb0 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2abc0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2abd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2abe0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2abf0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2ac00 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2ac10 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2ac20 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2ac30 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2ac40 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2ac50 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2ac60 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2ac70 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2ac80 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2ac90 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2aca0 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2acb0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2acc0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2acd0 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2ace0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2acf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2ad00 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2ad10 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2ad20 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2ad30 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2ad40 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2ad50 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2ad60 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2ad70 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20  t implementaton 
2ad80 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2ad90 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2ada0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2adb0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2adc0 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a  h createFlag==1.
2add0 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2ade0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2adf0 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2ae00 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2ae10 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2ae20 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2ae30 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2ae40 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2ae50 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2ae60 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2ae70 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2ae80 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2ae90 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2aea0 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2aeb0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2aec0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2aed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2aee0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2aef0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2af00 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2af10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2af20 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2af30 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2af40 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2af50 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2af60 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2af70 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2af80 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2af90 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2afa0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2afb0 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2afc0 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2afd0 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2afe0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2aff0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2b000 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2b010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b020 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2b030 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2b040 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2b050 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
2b060 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2b070 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2b080 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2b090 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2b0a0 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
2b0b0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2b0c0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
2b0d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2b0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b0f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2b100 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2b110 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2b120 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
2b130 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2b140 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
2b150 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
2b160 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2b170 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
2b180 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
2b190 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2b1a0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
2b1b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b1c0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2b1d0 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
2b1e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
2b1f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
2b200 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
2b210 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2b220 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
2b230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2b240 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
2b250 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
2b260 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2b270 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
2b280 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
2b290 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
2b2a0 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
2b2b0 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
2b2c0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
2b2d0 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
2b2e0 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
2b2f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
2b300 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
2b310 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
2b320 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
2b330 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
2b340 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
2b350 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
2b360 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
2b370 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
2b380 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
2b390 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
2b3a0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
2b3b0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
2b3c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
2b3d0 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
2b3e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
2b3f0 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
2b400 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
2b410 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
2b420 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
2b430 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
2b440 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
2b450 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
2b460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b470 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
2b480 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
2b490 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
2b4a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
2b4b0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
2b4c0 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
2b4d0 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
2b4e0 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
2b4f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2b500 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
2b510 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
2b520 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
2b530 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
2b540 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
2b550 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
2b560 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
2b570 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
2b580 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
2b590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b5a0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
2b5b0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2b5c0 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
2b5d0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
2b5e0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
2b5f0 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
2b600 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
2b610 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
2b620 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
2b630 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
2b640 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
2b650 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
2b660 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
2b670 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
2b680 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
2b690 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
2b6a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
2b6b0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
2b6c0 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
2b6d0 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
2b6e0 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
2b6f0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2b700 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
2b710 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2b720 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b730 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
2b740 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2b750 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b770 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
2b780 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b790 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2b7a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2b7b0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
2b7c0 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
2b7d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
2b7e0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2b7f0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2b800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b810 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
2b820 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
2b830 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b840 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2b850 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2b860 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
2b870 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2b880 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2b890 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
2b8a0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2b8b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2b8c0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2b8d0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2b8e0 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2b8f0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2b900 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2b910 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2b920 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2b930 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2b940 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2b950 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2b960 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2b970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b980 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2b990 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2b9a0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2b9b0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2b9c0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2b9d0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2b9e0 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2b9f0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2ba00 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2ba10 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2ba20 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2ba30 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2ba40 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2ba50 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2ba60 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2ba70 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2ba80 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2ba90 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2baa0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2bab0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2bac0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2bad0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2bae0 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2baf0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2bb00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2bb10 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2bb20 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2bb30 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2bb40 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2bb50 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2bb60 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2bb70 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2bb80 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2bb90 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
2bba0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2bbb0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2bbc0 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2bbd0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2bbe0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2bbf0 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2bc00 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2bc10 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2bc20 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2bc30 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2bc40 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2bc50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2bc60 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2bc70 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2bc80 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2bc90 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2bca0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2bcb0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2bcc0 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2bcd0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2bce0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2bcf0 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2bd00 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2bd10 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2bd20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2bd30 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2bd40 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2bd50 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2bd60 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2bd70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2bd80 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2bd90 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2bda0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2bdb0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2bdc0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2bdd0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2bde0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2bdf0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2be00 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2be10 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2be20 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2be30 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2be40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2be50 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2be60 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2be70 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2be80 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2be90 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2bea0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2beb0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2bec0 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2bed0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2bee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2bef0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2bf00 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2bf10 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2bf20 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf40 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2bf50 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2bf60 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2bf70 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2bf80 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2bf90 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2bfa0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2bfb0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2bfc0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2bfd0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2bfe0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2bff0 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2c000 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2c010 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2c020 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2c030 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2c040 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2c050 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2c060 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2c070 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2c080 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2c090 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c0a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2c0b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2c0c0 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2c0d0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2c0e0 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2c0f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2c100 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2c110 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c120 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2c130 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2c140 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2c150 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2c160 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2c170 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2c180 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2c190 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2c1a0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2c1b0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2c1c0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2c1d0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2c1e0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2c1f0 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2c200 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2c210 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2c220 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c230 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2c240 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2c250 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2c260 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2c270 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2c280 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2c290 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2c2a0 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2c2b0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2c2c0 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2c2d0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c2e0 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2c2f0 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2c300 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2c310 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2c320 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2c330 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c340 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2c350 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2c360 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2c370 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2c380 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c390 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2c3a0 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2c3b0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2c3c0 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2c3d0 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2c3e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2c3f0 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2c400 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2c410 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2c420 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2c430 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
2c440 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2c450 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
2c460 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2c470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2c480 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
2c490 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2c4a0 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
2c4b0 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
2c4c0 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
2c4d0 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
2c4e0 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
2c4f0 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
2c500 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
2c510 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
2c520 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
2c530 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2c540 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2c550 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
2c560 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
2c570 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
2c580 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2c590 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c5a0 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
2c5b0 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
2c5c0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c5d0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c5e0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c5f0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
2c600 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c610 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c620 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2c630 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
2c640 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2c650 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2c660 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2c670 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2c680 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2c690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c6a0 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2c6b0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2c6c0 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2c6d0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2c6e0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c6f0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2c700 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2c710 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2c720 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c730 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2c740 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2c750 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c760 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2c770 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2c780 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2c790 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2c7a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2c7b0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2c7c0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2c7d0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2c7e0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2c7f0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2c800 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2c810 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2c820 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2c830 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2c840 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2c850 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2c860 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2c870 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2c880 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c890 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2c8a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2c8b0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2c8c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2c8d0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2c8e0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2c8f0 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2c900 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2c910 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2c920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c930 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2c940 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2c950 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2c960 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2c970 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2c980 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2c990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c9a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2c9b0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2c9c0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2c9d0 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2c9e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c9f0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2ca00 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2ca10 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2ca20 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2ca30 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2ca40 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2ca50 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2ca60 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ca70 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2ca80 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2ca90 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2caa0 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2cab0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2cac0 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2cad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cae0 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2caf0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2cb00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2cb10 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2cb20 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2cb30 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2cb40 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2cb50 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2cb60 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2cb70 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2cb80 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2cb90 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2cba0 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2cbb0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2cbc0 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2cbd0 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2cbe0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2cbf0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2cc00 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2cc10 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2cc20 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2cc30 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2cc40 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2cc50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2cc60 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2cc70 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2cc80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2cca0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2ccb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ccc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ccd0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2cce0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2ccf0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2cd00 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2cd10 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2cd20 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2cd30 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cd40 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2cd50 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2cd60 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2cd70 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2cd80 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2cd90 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2cdc0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2cdd0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdf0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2ce00 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2ce10 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2ce20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2ce30 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2ce40 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2ce50 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2ce60 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2ce70 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2ce80 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2ce90 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2cea0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2ceb0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2cec0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2ced0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2cee0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2cef0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2cf00 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2cf10 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2cf20 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2cf30 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2cf40 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2cf50 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2cf60 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2cf70 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2cf80 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2cf90 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2cfa0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2cfb0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2cfc0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2cfd0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2cfe0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2cff0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2d000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2d010 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2d020 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d030 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2d040 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2d050 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2d060 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d070 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2d080 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2d090 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d0a0 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2d0b0 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2d0c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2d0d0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2d0e0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2d0f0 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2d100 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2d110 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2d120 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d130 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2d140 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2d150 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2d160 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2d170 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d180 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2d190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d1a0 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2d1b0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2d1c0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2d1d0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2d1e0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2d1f0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2d200 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2d210 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2d220 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2d230 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d240 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2d250 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2d260 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d270 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d280 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2d290 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2d2a0 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2d2b0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d2c0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2d2d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d2e0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2d2f0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2d300 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2d310 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d320 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2d330 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2d340 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2d350 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2d360 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2d370 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2d380 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2d390 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2d3a0 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2d3b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2d3c0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2d3d0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2d3e0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2d3f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2d400 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d410 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d420 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2d430 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2d440 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d450 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2d460 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2d470 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d480 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2d490 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d4a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d4b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d4c0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2d4d0 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2d4e0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d4f0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d500 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d510 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2d520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d530 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2d540 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2d550 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d560 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2d570 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2d580 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d590 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2d5a0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2d5b0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d5c0 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2d5d0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d5e0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d5f0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d600 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2d610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d620 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d630 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2d640 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2d650 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2d660 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2d670 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2d680 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2d690 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d6a0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d6b0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2d6e0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2d6f0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2d700 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2d710 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2d720 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2d730 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2d740 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2d750 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2d760 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2d770 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2d780 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2d790 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2d7a0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2d7b0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2d7c0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2d7d0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2d7e0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2d7f0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2d800 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2d810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d820 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2d830 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2d840 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2d850 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2d860 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d870 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2d880 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2d890 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2d8a0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2d8b0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2d8c0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2d8d0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2d8e0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2d8f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2d900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d910 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2d920 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2d930 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2d940 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2d950 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2d960 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2d970 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2d980 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2d990 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2d9a0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2d9b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2d9c0 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2d9d0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2d9e0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2d9f0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2da00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2da10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2da20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da30 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2da40 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2da50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2da60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2da70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2da80 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2da90 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
2daa0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2dab0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2dac0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2dad0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
2dae0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2daf0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2db00 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2db10 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2db20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2db30 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2db40 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2db50 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2db60 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2db70 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2db80 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2db90 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2dba0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2dbb0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2dbc0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2dbd0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2dbe0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2dbf0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2dc00 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2dc10 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2dc20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2dc30 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2dc40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2dc50 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2dc60 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2dc70 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2dc80 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2dc90 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2dca0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2dcb0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2dcc0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2dcd0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2dce0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2dcf0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2dd00 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2dd10 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2dd20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2dd30 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2dd40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2dd50 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2dd60 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2dd70 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2dd80 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2dd90 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2dda0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2ddb0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2ddc0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2ddd0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2dde0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
2ddf0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2de00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2de10 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
2de20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2de30 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2de40 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2de50 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2de60 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2de70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2de80 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2de90 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2dea0 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2deb0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2dec0 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2ded0 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2dee0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2def0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2df00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2df10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2df20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2df30 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2df40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2df50 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2df60 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2df70 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2df80 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2df90 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2dfa0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2dfb0 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
2dfc0 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
2dfd0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
2dfe0 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
2dff0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2e000 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2e010 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e020 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e030 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
2e040 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
2e050 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2e060 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2e070 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2e080 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e090 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2e0a0 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2e0b0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
2e0c0 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2e0d0 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
2e0e0 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
2e0f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2e100 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2e110 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e130 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2e140 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2e150 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2e160 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
2e170 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2e180 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2e190 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2e1a0 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2e1b0 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2e1c0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2e1d0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2e1e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2e1f0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2e200 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2e210 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2e220 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2e230 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e240 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2e250 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e260 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2e270 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2e280 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2e290 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2e2a0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2e2b0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2e2c0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2e2d0 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2e2e0 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2e2f0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2e300 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2e310 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  K; */.#if 0.  as
2e320 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2e330 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
2e340 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
2e350 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
2e360 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  K) );.#endif.  /
2e370 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2e380 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2e390 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2e3a0 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2e3b0 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2e3c0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2e3d0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2e3e0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2e3f0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2e400 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2e410 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2e420 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2e430 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2e440 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2e450 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2e460 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2e470 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2e480 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2e490 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2e4a0 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2e4b0 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2e4c0 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2e4d0 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2e4e0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2e4f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2e500 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2e510 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2e520 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
2e530 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2e540 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e550 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2e560 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e570 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30  er->syncFlags==0
2e580 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e590 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2e5a0 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2e5b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
2e5c0 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  kptSyncFlags==0 
2e5d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2e5e0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2e5f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2e600 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2e610 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2e620 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2e630 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2e640 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2e650 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2e660 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2e670 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2e680 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2e690 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2e6a0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2e6b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e6c0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2e6d0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2e6e0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2e6f0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2e700 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2e710 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2e720 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2e730 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2e740 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2e750 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2e760 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2e770 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2e780 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2e790 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2e7a0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2e7b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2e7c0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2e7d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2e7e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2e7f0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2e800 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2e810 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2e820 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2e830 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2e840 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2e850 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2e860 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2e870 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2e880 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2e890 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
2e8a0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
2e8b0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2e8c0 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f  >aHash)); */.  /
2e8d0 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  * pPager->szMmap
2e8e0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2e8f0 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77  T_MMAP_SIZE // w
2e900 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74  ill be set by bt
2e910 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50  ree.c */..  *ppP
2e920 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2e930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e940 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79  K;.}.../* Verify
2e950 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2e960 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
2e970 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65  be deleted or re
2e980 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a  named out from.*
2e990 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67 65  * under the page
2e9a0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
2e9b0 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61  E_OK if the data
2e9c0 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65  base is still we
2e9d0 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74  re it ought.** t
2e9e0 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52  o be on disk.  R
2e9f0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28  eturn non-zero (
2ea00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2ea10 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20  DBMOVED or some 
2ea20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
2ea30 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ode from sqlite3
2ea40 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74  OsAccess()) if t
2ea50 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2ea60 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f  gone missing..*/
2ea70 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61  .static int data
2ea80 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61  baseIsUnmoved(Pa
2ea90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2eaa0 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20  int bHasMoved = 
2eab0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
2eac0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
2ead0 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
2eae0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
2eaf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
2eb00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2eb10 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
2eb20 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2eb30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c   && pPager->zFil
2eb40 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63  ename[0] );.  rc
2eb50 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
2eb60 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
2eb70 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2eb80 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61  _HAS_MOVED, &bHa
2eb90 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72  sMoved);.  if( r
2eba0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
2ebb0 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ND ){.    /* If 
2ebc0 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69  the HAS_MOVED fi
2ebd0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e  le-control is un
2ebe0 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73  implemented, ass
2ebf0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
2ec00 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e.    ** has not
2ec10 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68   been moved.  Th
2ec20 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72  at is the histor
2ec30 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66  ical behavior of
2ec40 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74   SQLite: prior t
2ec50 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  o.    ** version
2ec60 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72   3.8.3, it never
2ec70 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20   checked */.    
2ec80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ec90 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2eca0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61  SQLITE_OK && bHa
2ecb0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63  sMoved ){.    rc
2ecc0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
2ecd0 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a  LY_DBMOVED;.  }.
2ece0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ecf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ed00 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2ed10 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69  fter transitioni
2ed20 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e  ng from PAGER_UN
2ed30 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52  LOCK to.** PAGER
2ed40 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49  _SHARED state. I
2ed50 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  t tests if there
2ed60 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2ed70 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  l present in.** 
2ed80 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2ed90 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
2eda0 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ger. A hot journ
2edb0 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a  al is one that .
2edc0 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ** needs to be p
2edd0 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f  layed back. Acco
2ede0 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75  rding to this fu
2edf0 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f  nction, a hot-jo
2ee00 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78  urnal.** file ex
2ee10 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ists if the foll
2ee20 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61  owing criteria a
2ee30 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
2ee40 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2ee50 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  le exists in the
2ee60 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e   file system, an
2ee70 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63  d.**   * No proc
2ee80 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2ee90 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
2eea0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2eeb0 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a  base file, and.*
2eec0 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2eed0 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69  se file itself i
2eee0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
2eef0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
2ef00 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  and.**   * The f
2ef10 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
2ef20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2ef30 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
2ef40 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  0x00..**.** If t
2ef50 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2ef60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ef70 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
2ef80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2ef90 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
2efa0 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
2efb0 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
2efc0 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
2efd0 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
2efe0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49  the same name. I
2eff0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
2f010 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ** just deleted 
2f020 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20  using OsDelete, 
2f030 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2f040 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2f050 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2f060 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2f070 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63  utine does not c
2f080 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
2f090 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2f0a0 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74  l filename.** at
2f0b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2f0c0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
2f0d0 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74  s, and that mast
2f0e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
2f0f0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
2f100 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  t, then the jour
2f110 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2f120 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74  really hot. In t
2f130 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73  his.** case this
2f140 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2f150 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  turn a false-pos
2f160 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72  itive. The pager
2f170 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72  _playback().** r
2f180 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
2f190 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f  over that the jo
2f1a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2f1b0 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
2f1c0 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f   .** will not ro
2f1d0 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a  ll it back. .**.
2f1e0 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ** If a hot-jour
2f1f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  nal file is foun
2f200 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78  d to exist, *pEx
2f210 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31  ists is set to 1
2f220 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2f230 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2f240 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  no hot-journal f
2f250 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ile is present, 
2f260 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73  *pExists is.** s
2f270 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2f280 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2f290 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2f2a0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2f2b0 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ng.** to determi
2f2c0 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2f2d0 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  t a hot-journal 
2f2e0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65  file exists, the
2f2f0 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   IO error.** cod
2f300 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2f310 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2f320 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66  pExists is undef
2f330 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2f340 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
2f350 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
2f360 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
2f370 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2f380 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2f390 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
2f3a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f3c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2f3d0 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20  nt exists = 1;  
2f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f3f0 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61  True if a journa
2f400 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2f410 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f  t */.  int jrnlO
2f420 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70  pen = !!isOpen(p
2f430 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20  Pager->jfd);..  
2f440 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f450 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2f460 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2f470 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2f480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f490 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2f4a0 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  EN );..  assert(
2f4b0 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
2f4c0 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
2f4d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2f4e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
2f4f0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
2f500 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
2f510 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
2f520 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
2f530 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2f540 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f550 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
2f560 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2f570 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2f580 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
2f590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2f5a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
2f5b0 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
2f5c0 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  ocked = 0;      
2f5d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f5e0 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
2f5f0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2f600 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
2f610 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
2f620 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
2f630 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
2f640 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
2f650 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
2f660 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
2f670 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
2f680 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
2f690 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
2f6a0 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
2f6b0 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
2f6c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2f6d0 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
2f6e0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
2f6f0 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
2f700 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
2f710 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
2f720 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
2f730 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
2f740 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
2f750 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
2f760 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2f770 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
2f780 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
2f790 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
2f7a0 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
2f7b0 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
2f7c0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
2f7d0 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
2f7e0 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
2f7f0 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
2f800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2f810 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2f820 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
2f830 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
2f840 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f850 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
2f860 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ed ){.      Pgno
2f870 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2f880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f890 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2f8a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2f8b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2f8c0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2f8d0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2f8e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f8f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
2f900 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2f910 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
2f920 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
2f930 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
2f940 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
2f950 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
2f960 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
2f970 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
2f980 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
2f990 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
2f9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f9b0 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
2f9c0 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
2f9d0 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
2f9e0 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
2f9f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
2fa00 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
2fa10 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
2fa20 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
2fa30 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
2fa40 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
2fa50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
2fa60 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
2fa70 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
2fa80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
2fa90 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
2faa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
2fab0 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
2fac0 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
2fad0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
2fae0 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
2faf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2fb00 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
2fb10 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
2fb20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
2fb30 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2fb40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
2fb50 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2fb60 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
2fb70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fb80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2fb90 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
2fba0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2fbb0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
2fbc0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2fbd0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
2fbe0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
2fbf0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
2fc00 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
2fc10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2fc20 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
2fc30 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
2fc40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2fc50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2fc60 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
2fc70 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2fc80 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
2fc90 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
2fca0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2fcb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fcc0 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
2fcd0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
2fce0 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
2fcf0 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
2fd00 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
2fd10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2fd20 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
2fd30 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
2fd40 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
2fd50 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
2fd60 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
2fd70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
2fd80 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
2fd90 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2fda0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2fdb0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2fdc0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
2fdd0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2fde0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
2fdf0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
2fe00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fe10 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2fe20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2fe30 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2fe40 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
2fe50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2fe60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fe70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
2fe80 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
2fe90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2fea0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
2feb0 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
2fec0 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
2fed0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fee0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
2fef0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
2ff10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ff20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ff30 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
2ff40 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
2ff50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
2ff60 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
2ff70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2ff80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
2ff90 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
2ffa0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
2ffb0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2ffc0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
2ffd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2ffe0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
2fff0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30000 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
30010 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
30020 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
30030 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
30040 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
30050 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
30060 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
30070 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
30080 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
30090 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
300a0 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
300b0 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
300c0 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
300d0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
300e0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
300f0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
30100 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
30110 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
30120 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
30130 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
30140 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
30150 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
30160 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
30170 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
30180 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
30190 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
301a0 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
301b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
301c0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
301d0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
301e0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
301f0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
30200 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
30210 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30220 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
30230 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
30240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30260 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30270 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
30280 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
30290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
302a0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
302b0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
302c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
302d0 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
302e0 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
302f0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
30300 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  e() until after 
30310 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
30320 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
30330 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
30340 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
30350 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
30360 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
30370 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
30380 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
30390 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
303a0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
303b0 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
303c0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
303d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
303e0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
303f0 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
30400 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f  R_OPEN state (no
30410 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
30420 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
30430 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
30440 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
30450 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
30460 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
30470 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30480 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
30490 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
304a0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
304b0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
304c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
304d0 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
304e0 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
304f0 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
30500 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
30510 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
30520 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
30530 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
30540 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30550 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
30560 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
30570 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
30580 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
30590 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
305a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
305b0 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
305c0 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
305d0 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
305e0 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
305f0 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
30600 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
30610 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
30620 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
30630 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
30640 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
30650 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
30660 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
30670 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
30680 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
30690 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
306a0 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
306b0 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
306c0 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
306d0 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
306e0 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
306f0 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
30700 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
30710 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
30720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
30730 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
30740 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
30750 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
30760 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
30770 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
30780 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
30790 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
307a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
307b0 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67  e or .** rolling
307c0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
307d0 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
307e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
307f0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
30800 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
30810 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
30820 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
30830 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30840 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30850 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
30860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
30870 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
30880 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
30890 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
308a0 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
308b0 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
308c0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
308d0 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f   pager state sho
308e0 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20  uld either.  ** 
308f0 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45  be OPEN or READE
30900 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c  R. READER is onl
30910 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
30920 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61  e pager is or wa
30930 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75  s in .  ** exclu
30940 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
30950 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30960 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
30970 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
30980 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
30990 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
309a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
309b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
309c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
309d0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
309e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
309f0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
30a00 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20  if( NEVER(MEMDB 
30a10 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
30a20 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50  de) ){ return pP
30a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d  ager->errCode; }
30a40 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
30a50 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
30a60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30a70 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
30a80 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61    int bHotJourna
30a90 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
30aa0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
30ab0 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f   exists a hot jo
30ac0 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20  urnal-file */.. 
30ad0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
30ae0 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  B );..    rc = p
30af0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
30b00 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
30b10 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
30b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30b40 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
30b50 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
30b60 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
30b70 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f  LOCK );.      go
30b80 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
30b90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
30ba0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30bb0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
30bc0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
30bd0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
30be0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
30bf0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
30c00 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
30c10 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
30c20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30c30 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
30c40 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
30c50 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
30c60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
30c70 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
30c80 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
30c90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ca0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30cb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
30cc0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
30cd0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
30ce0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
30cf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
30d00 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
30d10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
30d20 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
30d30 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
30d40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
30d50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30d60 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
30d70 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
30d80 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
30d90 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
30da0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
30db0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
30dc0 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
30dd0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
30de0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
30df0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
30e00 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
30e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
30e20 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
30e30 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
30e40 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
30e50 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
30e60 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
30e70 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
30e80 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
30e90 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
30ea0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
30eb0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
30ec0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
30ed0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
30ee0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
30ef0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
30f00 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
30f10 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
30f20 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
30f30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30f40 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
30f50 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
30f60 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
30f70 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
30f80 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
30f90 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
30fa0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
30fb0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
30fc0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
30fd0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
30fe0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
30ff0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
31000 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
31010 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
31020 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
31030 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
31040 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
31050 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31060 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
31070 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
31080 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
31090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
310a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
310b0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
310c0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
310d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
310e0 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
310f0 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
31100 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
31110 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
31120 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
31130 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
31140 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
31150 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
31160 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
31170 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
31180 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
31190 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
311a0 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
311b0 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
311c0 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
311d0 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
311e0 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
311f0 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
31200 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
31210 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
31220 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
31230 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
31240 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
31250 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
31260 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
31270 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
31280 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
31290 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
312a0 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
312b0 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
312c0 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
312d0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
312e0 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
312f0 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
31300 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
31310 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
31320 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
31330 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
31340 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
31350 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
31360 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
31370 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
31380 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
31390 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
313a0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
313b0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
313c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
313d0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
313e0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
313f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
31410 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
31420 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
31430 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
31440 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
31450 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
31460 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
31470 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
31480 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
31490 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
314a0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
314b0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
314c0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
314d0 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
314e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
314f0 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
31500 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
31510 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31520 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
31530 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
31540 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31550 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
31560 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
31570 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
31580 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31590 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
315a0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
315b0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
315c0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
315d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
315e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
315f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31600 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
31610 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31620 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
31630 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
31640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31650 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
31660 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
31670 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
31680 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
31690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
316a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
316b0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
316c0 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
316d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
316e0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
316f0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
31700 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
31710 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
31720 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
31730 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
31740 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
31750 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
31760 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
31770 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
31780 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
31790 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
317a0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
317b0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
317c0 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
317d0 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
317e0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
317f0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
31800 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
31810 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
31820 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
31830 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
31840 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
31850 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
31860 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
31870 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
31880 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
31890 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
318a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
318b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
318c0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
318d0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
318e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
318f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31910 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31920 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
31930 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
31940 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
31950 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
31960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
31970 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
31980 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
31990 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
319a0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
319b0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
319c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
319d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
319e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
319f0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
31a00 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
31a10 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
31a20 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
31a30 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
31a40 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
31a50 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
31a60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31a70 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
31a80 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
31a90 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
31aa0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
31ab0 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
31ac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31ad0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
31ae0 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
31af0 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
31b00 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
31b10 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
31b20 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
31b30 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
31b40 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
31b50 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
31b60 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
31b70 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
31b80 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
31b90 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
31ba0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
31bb0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
31bc0 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
31bd0 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
31be0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
31bf0 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
31c00 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
31c10 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
31c20 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
31c30 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
31c40 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
31c50 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
31c60 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
31c70 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
31c80 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
31c90 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
31ca0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
31cb0 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
31cc0 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
31cd0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
31ce0 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
31cf0 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
31d00 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
31d10 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
31d20 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
31d30 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
31d40 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
31d50 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
31d60 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
31d70 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
31d80 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
31d90 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
31da0 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
31db0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
31dc0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
31dd0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
31de0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31df0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
31e00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31e10 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
31e20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
31e30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
31e40 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
31e50 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
31e60 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
31e70 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
31e80 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
31e90 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
31ea0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
31eb0 6d 70 46 69 6c 65 20 26 26 20 28 0a 20 20 20 20  mpFile && (.    
31ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 61 63      pPager->pBac
31ed0 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c  kup .     || sql
31ee0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
31ef0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
31f00 63 68 65 29 3e 30 20 0a 20 20 20 20 20 7c 7c 20  che)>0 .     || 
31f10 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
31f20 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
31f30 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
31f40 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
31f50 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
31f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
31f70 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
31f80 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
31f90 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
31fa0 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
31fb0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
31fc0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
31fd0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
31fe0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
31ff0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
32000 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
32010 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32020 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
32030 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
32040 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
32050 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
32060 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
32070 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
32080 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
32090 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
320a0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
320b0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
320c0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
320d0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
320e0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
320f0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
32100 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
32110 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
32120 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
32130 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
32140 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
32150 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
32160 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
32170 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
32180 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
32190 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
321a0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
321b0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
321c0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
321d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
321e0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
321f0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
32200 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
32210 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
32220 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
32230 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
32240 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  /.      Pgno nPa
32250 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
32260 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
32270 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
32280 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
32290 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
322a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
322b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
322c0 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65   rc ) goto faile
322d0 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50  d;..      if( nP
322e0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
322f0 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
32300 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
32310 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
32320 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
32330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
32340 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
32350 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
32360 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
32370 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
32380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32390 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
323a0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
323b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
323c0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
323d0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
323e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
323f0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
32400 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32410 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
32420 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
32430 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32440 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
32450 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
32460 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
32470 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
32480 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  er);..        /*
32490 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62   Unmap the datab
324a0 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20  ase file. It is 
324b0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78  possible that ex
324c0 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73  ternal processes
324d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
324e0 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74  have truncated t
324f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32500 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64   and then extend
32510 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20  ed it back.     
32520 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69     ** to its ori
32530 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65  ginal size while
32540 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61   this process wa
32550 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20  s not holding a 
32560 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  lock..        **
32570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32580 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20  ere may exist a 
32590 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69  Pager.pMap mappi
325a0 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a  ng that appears.
325b0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
325c0 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20   the right size 
325d0 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61  but is not actua
325e0 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64  lly valid. Avoid
325f0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
32600 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20   possibility by 
32610 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62  unmapping the db
32620 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
32630 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
32640 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
32650 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
32660 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
32670 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
32680 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32690 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
326a0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
326b0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
326c0 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
326d0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
326e0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
326f0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
32700 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
32710 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
32720 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
32730 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
32740 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
32750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32760 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
32770 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
32780 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
32790 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
327a0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
327b0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
327c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
327d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
327e0 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
327f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
32800 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
32810 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32820 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
32830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32840 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
32850 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
32860 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
32870 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
32880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32890 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
328a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
328b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
328c0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
328d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
328e0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
328f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
32900 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
32910 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
32920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32930 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
32940 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
32950 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
32960 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
32970 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
32980 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
32990 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
329a0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
329b0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
329c0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
329d0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
329e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
329f0 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
32a00 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
32a10 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
32a20 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
32a30 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
32a40 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
32a50 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
32a60 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
32a70 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
32a80 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
32a90 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30  ger->nMmapOut==0
32aa0 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63   && (sqlite3Pcac
32ab0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
32ac0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
32ad0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
32ae0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
32af0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
32b00 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
32b10 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
32b20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
32b30 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
32b40 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
32b50 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
32b60 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
32b70 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
32b80 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
32b90 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
32ba0 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
32bb0 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
32bc0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
32bd0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
32be0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
32bf0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
32c00 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
32c10 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
32c20 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
32c30 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
32c40 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
32c50 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
32c60 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
32c70 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
32c80 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
32c90 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
32ca0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
32cb0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
32cc0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
32cd0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
32ce0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
32cf0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
32d00 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
32d10 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
32d20 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
32d30 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
32d40 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
32d50 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
32d60 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
32d70 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
32d80 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
32d90 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
32da0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
32db0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
32dc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
32dd0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
32de0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
32df0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
32e00 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
32e10 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
32e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
32e30 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
32e40 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
32e50 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
32e60 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
32e70 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
32e80 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
32e90 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
32ea0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
32eb0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
32ec0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
32ed0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
32ee0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
32ef0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
32f00 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
32f10 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
32f20 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
32f30 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
32f40 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
32f50 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
32f60 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
32f70 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
32f80 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
32f90 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
32fa0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
32fb0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
32fc0 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
32fd0 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
32fe0 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
32ff0 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
33000 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
33010 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
33020 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
33030 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
33040 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
33050 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
33060 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
33070 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
33080 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
33090 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
330a0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
330b0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
330c0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
330d0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
330e0 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
330f0 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
33100 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
33110 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33120 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
33130 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
33140 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
33150 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
33160 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
33170 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
33180 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
33190 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
331a0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
331b0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
331c0 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
331d0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
331e0 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
331f0 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
33200 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
33210 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
33220 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
33230 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
33240 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
33250 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
33260 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
33270 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
33280 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
33290 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
332a0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
332b0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
332c0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
332d0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
332e0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
332f0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
33300 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
33310 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
33320 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
33330 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
33340 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
33350 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
33360 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
33370 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
33380 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
33390 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
333a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
333b0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
333c0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
333d0 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
333e0 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
333f0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
33400 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
33410 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
33420 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
33430 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
33440 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
33450 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
33460 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
33470 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
33480 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
33490 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
334a0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
334b0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
334c0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
334d0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
334e0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
334f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
33500 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
33510 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
33520 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
33530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33540 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
33550 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
33560 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
33570 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
33580 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
33590 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
335a0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
335b0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
335c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
335d0 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
335e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
335f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
33600 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
33610 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33630 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
33640 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
33650 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
33660 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67  oContent = (flag
33670 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  s & PAGER_GET_NO
33680 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20  CONTENT);..  /* 
33690 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  It is acceptable
336a0 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f   to use a read-o
336b0 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20  nly (mmap) page 
336c0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63  for any page exc
336d0 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20  ept.  ** page 1 
336e0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
336f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33700 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51   open or the ACQ
33710 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  UIRE_READONLY.  
33720 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  ** flag was spec
33730 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  ified by the cal
33740 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67  ler. And so long
33750 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f   as the db is no
33760 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  t a .  ** tempor
33770 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
33780 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
33790 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70   const int bMmap
337a0 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26  Ok = (pgno!=1 &&
337b0 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
337c0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
337d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
337e0 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20  EADER || (flags 
337f0 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  & PAGER_GET_READ
33800 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51  ONLY)).#ifdef SQ
33810 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
33820 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f    && pPager->xCo
33830 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  dec==0.#endif.  
33840 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33850 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
33860 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
33870 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33880 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33890 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
338a0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20  noContent==0 || 
338b0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20  bMmapOk==0 );.. 
338c0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
338d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
338e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
338f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33900 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
33910 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
33920 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
33930 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
33940 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
33950 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
33960 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
33970 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
33980 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
33990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
339a0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
339b0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  ode;.  }else{.. 
339c0 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
339d0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
339e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
339f0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
33a00 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
33a10 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
33a20 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33a40 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33a50 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
33a60 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
33a70 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  & iFrame==0 ){. 
33a80 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
33a90 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
33aa0 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
33ab0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
33ac0 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67          (i64)(pg
33ad0 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
33ae0 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72  pageSize, pPager
33af0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61  ->pageSize, &pDa
33b00 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  ta.      );..   
33b10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33b20 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
33b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
33b40 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
33b50 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20  R_READER ){.    
33b60 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
33b70 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
33b80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
33b90 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
33ba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33bb0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
33bc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
33bd0 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
33be0 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  ge(pPager, pgno,
33bf0 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20   pData, &pPg);. 
33c00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33c20 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33c30 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
33c40 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
33c50 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
33c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33c70 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
33c80 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33c90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
33ca0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
33cb0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20   pPg;.          
33cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33ce0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33d00 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
33d10 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33d20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
33d40 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
33d50 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
33d60 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d   1, ppPage);.  }
33d70 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
33d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
33d90 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  Either the call 
33da0 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
33db0 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64  Fetch() returned
33dc0 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65   an error or the
33dd0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61  .    ** pager wa
33de0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
33df0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
33e00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
33e10 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
33e20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20  ** Set pPg to 0 
33e30 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  and jump to the 
33e40 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65  exception handle
33e50 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  r.  */.    pPg =
33e60 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   0;.    goto pag
33e70 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
33e80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
33e90 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
33ea0 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
33eb0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
33ec0 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a  er==pPager || (*
33ed0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
33ee0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70  =0 );..  if( (*p
33ef0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26  pPage)->pPager &
33f00 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
33f10 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
33f20 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
33f30 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
33f40 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
33f50 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
33f60 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
33f70 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
33f80 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
33f90 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
33fa0 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
33fb0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
33fc0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
33fd0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
33fe0 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a  ER_STAT_HIT]++;.
33ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34000 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
34010 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
34020 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
34030 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
34040 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
34050 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
34060 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
34070 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
34080 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
34090 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
340a0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
340b0 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
340c0 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
340d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
340e0 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
340f0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
34100 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
34110 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
34120 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
34130 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
34140 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
34150 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
34160 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34170 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34180 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34190 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
341a0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
341b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
341c0 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
341d0 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
341e0 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
341f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
34200 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
34210 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
34220 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
34230 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
34240 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34250 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34270 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
34280 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
34290 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
342a0 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
342b0 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
342c0 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
342d0 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
342e0 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
342f0 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
34300 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
34310 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
34320 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
34330 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
34340 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
34350 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
34360 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
34370 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
34380 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
34390 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
343a0 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
343b0 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
343c0 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
343d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
343e0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
343f0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
34400 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
34410 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
34420 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
34430 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
34440 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
34450 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
34460 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
34470 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34480 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34490 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
344a0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
344b0 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
344c0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
344d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
344e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
344f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
34500 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34510 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
34520 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
34530 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
34540 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
34550 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
34560 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
34570 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
34580 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
34590 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
345a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
345b0 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30  r) && bMmapOk==0
345c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
345d0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
345e0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
345f0 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
34600 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34620 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34630 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
34650 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
34660 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
34670 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
34680 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
34690 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
346a0 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
346b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
346c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
346d0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
346e0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
346f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
34700 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
34710 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
34720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
34730 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34740 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
34750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
34760 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
34770 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
34780 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
34790 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
347a0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
347b0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
347c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
347d0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
347e0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
347f0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
34800 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
34810 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
34820 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
34830 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
34840 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
34850 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
34860 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
34870 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
34880 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34890 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
348a0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
348b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
348c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
348d0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
348e0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
348f0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
34900 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
34910 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34920 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
34930 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
34940 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
34950 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34960 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
34970 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
34980 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
34990 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
349a0 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
349b0 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
349c0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
349d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
349e0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
349f0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
34a00 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
34a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34a20 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
34a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34a40 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34a50 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
34a60 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
34a70 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74  ERROR );.  sqlit
34a80 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
34a90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34aa0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
34ab0 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
34ac0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
34ad0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
34ae0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
34af0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
34b00 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
34b10 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
34b20 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
34b30 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
34b40 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
34b50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
34b60 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
34b70 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
34b80 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
34b90 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
34ba0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
34bb0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
34bc0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34bd0 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
34be0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
34bf0 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
34c00 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
34c10 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
34c20 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
34c30 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
34c40 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
34c50 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
34c60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34c70 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
34c80 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
34c90 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
34ca0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
34cb0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
34cc0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
34cd0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
34ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34cf0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
34d00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
34d10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
34d20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
34d30 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
34d40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
34d50 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
34d60 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
34d70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
34d80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34d90 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
34da0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
34db0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
34dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34dd0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
34de0 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
34df0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
34e00 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
34e10 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
34e20 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
34e30 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
34e40 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
34e50 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
34e60 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
34e70 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
34e80 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
34e90 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
34ea0 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
34eb0 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
34ec0 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
34ed0 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
34ee0 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
34ef0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
34f00 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
34f10 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
34f20 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
34f30 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
34f40 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
34f50 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
34f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
34f70 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
34f80 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
34f90 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
34fa0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
34fb0 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
34fc0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
34fd0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
34fe0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
34ff0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
35000 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
35010 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
35020 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
35030 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
35040 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
35050 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
35060 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
35070 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
35080 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
35090 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
350a0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
350b0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
350c0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
350d0 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
350e0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
350f0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
35100 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35110 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
35120 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35130 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35140 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
35150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35160 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
35170 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
35180 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
35190 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
351a0 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
351b0 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
351c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
351d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
351e0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
351f0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35200 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
35210 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35220 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35230 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
35240 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
35250 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
35260 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35270 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
35280 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
35290 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
352a0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
352b0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
352c0 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
352d0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
352e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
352f0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
35300 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
35310 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
35320 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35330 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
35340 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
35350 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
35360 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
35370 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
35380 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
35390 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
353a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
353b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
353c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
353d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
353e0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
353f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
35400 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
35410 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
35420 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
35430 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
35440 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
35450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
35460 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35470 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
35480 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
35490 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
354a0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
354b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
354c0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
354d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354e0 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74    /* VFS flags t
354f0 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  o open journal f
35500 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
35510 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
35520 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
35530 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
35540 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
35550 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
35560 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
35570 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
35580 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
35590 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
355a0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
355b0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
355c0 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  L).          );.
355d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
355e0 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
355f0 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74  base still has t
35600 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
35610 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20  it did when.    
35620 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72      ** it was or
35630 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e  iginally opened.
35640 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
35650 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
35660 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ed(pPager);.    
35670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35680 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20  TE_OK ){.#ifdef 
35690 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
356a0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
356b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
356c0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
356d0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
356e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
356f0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
35700 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
35710 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
35720 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73           );.#els
35730 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  e.          rc =
35740 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
35750 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
35760 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
35770 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
35780 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
35790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
357a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
357b0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
357c0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
357d0 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a    }.  .  .    /*
357e0 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
357f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
35800 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
35810 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
35820 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
35830 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
35840 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
35850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35860 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  ){.      /* TODO
35870 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
35880 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
35890 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
358a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
358b0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ec = 0;.      pP
358c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
358d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
358e0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
358f0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
35900 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
35910 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
35920 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
35930 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
35940 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35950 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
35960 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
35970 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35980 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
35990 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
359a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
359b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
359c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
359d0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
359e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
359f0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  = PAGER_WRITER_C
35a00 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20  ACHEMOD;.  }..  
35a10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35a20 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
35a30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
35a40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
35a50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
35a60 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
35a70 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
35a80 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
35a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35aa0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
35ab0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
35ac0 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
35ad0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35ae0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
35af0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
35b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
35b10 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
35b20 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
35b30 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
35b40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
35b50 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
35b60 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
35b70 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
35b80 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
35b90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
35ba0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
35bb0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
35bc0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
35bd0 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
35be0 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
35bf0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
35c00 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
35c10 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
35c20 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
35c30 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
35c40 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
35c50 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
35c60 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
35c70 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
35c80 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
35c90 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
35ca0 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
35cb0 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
35cc0 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
35cd0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
35ce0 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
35cf0 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
35d00 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
35d10 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
35d20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
35d30 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
35d40 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
35d50 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
35d60 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
35d70 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
35d80 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
35d90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
35da0 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
35db0 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
35dc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35dd0 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
35de0 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
35df0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
35e00 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
35e10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
35e20 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
35e30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
35e40 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70  GER_ERROR );.  p
35e50 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
35e60 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
35e70 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41  Memory;..  if( A
35e80 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53  LWAYS(pPager->eS
35e90 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
35ea0 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ER) ){.    asser
35eb0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
35ec0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20  urnal==0 );..   
35ed0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
35ee0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35ef0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
35f00 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  r is configured 
35f10 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d  to use locking_m
35f20 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61  ode=exclusive, a
35f30 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65  nd an.      ** e
35f40 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
35f50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
35f60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
35f70 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77  d, obtain it now
35f80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35f90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
35fa0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
35fb0 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
35fc0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
35fd0 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20  al, -1) ){.     
35fe0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
35ff0 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
36000 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
36010 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36030 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36050 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
36060 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
36070 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
36080 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
36090 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
360a0 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
360b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
360c0 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
360d0 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
360e0 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
360f0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
36100 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
36110 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
36120 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
36130 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
36140 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
36150 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
36160 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
36170 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
36180 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
36190 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
361a0 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
361b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
361c0 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
361d0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
361e0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
361f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
36200 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
36210 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
36220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
36230 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
36240 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
36250 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
36260 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
36270 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
36280 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
36290 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
362a0 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
362b0 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
362c0 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
362d0 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
362e0 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
362f0 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
36300 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
36310 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
36320 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
36330 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
36340 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
36350 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36360 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29  E_OK && exFlag )
36370 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36380 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
36390 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
363a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
363b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
363c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
363d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ){.      /* Chan
363e0 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43  ge to WRITER_LOC
363f0 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20  KED state..     
36400 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
36410 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
36420 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52  .eState to PAGER
36430 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f  _WRITER_LOCKED o
36440 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  r CACHEMOD.     
36450 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20   ** when it has 
36460 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
36470 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
36480 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53  o DBMOD or FINIS
36490 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  HED..      ** Th
364a0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
364b0 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68   those states th
364c0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62  e code to roll b
364d0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  ack savepoint . 
364e0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
364f0 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61  ions may copy da
36500 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
36510 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
36520 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
36530 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c   ** file as well
36540 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67   as into the pag
36550 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77  e cache. Which w
36560 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63  ould be incorrec
36570 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57  t in .      ** W
36580 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
36590 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
365a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
365b0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20  RITER_LOCKED;.  
365c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
365d0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
365e0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
365f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
36600 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36610 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36620 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
36630 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
36640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
36650 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
36660 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
36670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
36680 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36690 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
366a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
366b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
366c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
366d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
366e0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
366f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
36700 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
36710 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
36720 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
36730 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
36740 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72  ager)));.  retur
36750 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
36760 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
36770 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
36780 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
36790 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
367a0 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
367b0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
367c0 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
367d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
367e0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
367f0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
36800 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
36810 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
36820 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
36830 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
36840 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
36850 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
36860 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
36870 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
36880 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
36890 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
368a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
368b0 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
368c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
368d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
368e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
368f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 6e 4a 6f 75  _OK;.  int inJou
36900 72 6e 61 6c 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rnal;..  /* This
36910 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
36920 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
36930 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36940 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20  n has already . 
36950 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64   ** been started
36960 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
36970 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
36980 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69  t be open at thi
36990 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74  s point..  ** It
369a0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
369b0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
369c0 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ate..  */.  asse
369d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
369e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
369f0 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
36a00 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36a10 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36a20 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36a30 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36a40 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
36a50 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
36a60 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36a70 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36a90 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29  er->errCode==0 )
36aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36ab0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  er->readOnly==0 
36ac0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
36ad0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
36ae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
36af0 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
36b00 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
36b10 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
36b20 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
36b30 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
36b40 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
36b50 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
36b60 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
36b70 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
36b80 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
36b90 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
36ba0 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
36bb0 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
36bc0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
36bd0 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
36be0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
36bf0 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
36c00 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
36c10 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
36c20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
36c30 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
36c40 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
36c50 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
36c60 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
36c70 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
36c80 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
36c90 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
36ca0 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
36cb0 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
36cc0 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
36cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
36ce0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36cf0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36d00 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
36d10 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
36d20 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
36d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
36d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36d60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
36d70 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
36d80 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
36d90 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36da0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
36db0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
36dc0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
36dd0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
36de0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
36df0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
36e00 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
36e10 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
36e20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
36e30 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
36e40 50 67 29 3b 0a 20 20 69 6e 4a 6f 75 72 6e 61 6c  Pg);.  inJournal
36e50 20 3d 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c   = pageInJournal
36e60 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
36e70 20 69 66 28 20 69 6e 4a 6f 75 72 6e 61 6c 20 26   if( inJournal &
36e80 26 20 28 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  & (pPager->nSave
36e90 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 21 73 75 62  point==0 || !sub
36ea0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
36eb0 67 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  g)) ){.    asser
36ec0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
36ed0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
36ee0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
36ef0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
36f00 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
36f10 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
36f20 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
36f30 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
36f40 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
36f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
36f60 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
36f70 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
36f80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
36f90 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
36fa0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
36fb0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
36fc0 69 66 28 20 21 69 6e 4a 6f 75 72 6e 61 6c 20 26  if( !inJournal &
36fd0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
36fe0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
36ff0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
37000 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
37010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
37020 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
37030 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f  bOrigSize && isO
37040 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37050 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
37060 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
37070 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20  har *pData2;.   
37080 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20       i64 iOff = 
37090 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
370a0 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ff;..        /* 
370b0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
370c0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
370d0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
370e0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
370f0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37100 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
37110 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
37120 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
37130 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
37140 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
37150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
37160 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
37170 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
37180 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
37190 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
371a0 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
371b0 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
371c0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
371d0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
371e0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
371f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37200 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
37210 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
37220 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
37230 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20  u8*)pData2);..  
37240 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
37250 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
37260 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ll error occurs 
37270 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
37280 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
37290 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
372a0 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
372b0 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
372c0 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
372d0 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
372e0 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
372f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
37300 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
37310 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
37320 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
37330 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
37340 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
37350 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
37360 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
37370 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
37380 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
37390 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
373a0 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
373b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
373c0 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
373d0 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
373e0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
373f0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
37400 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20  D_SYNC;..       
37410 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
37420 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
37430 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
37440 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37460 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
37470 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
37480 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
37490 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
374a0 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
374b0 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
374c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
374d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
374e0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
374f0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
37500 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
37510 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
37520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37540 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
37550 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
37560 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
37570 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
37580 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
37590 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
375a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
375b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
375c0 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
375d0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
375e0 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
375f0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
37600 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
37610 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
37620 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
37630 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
37640 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37650 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
37660 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
37670 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
37680 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
37690 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
376a0 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50  )));..        pP
376b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
376c0 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
376d0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
376e0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
376f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37700 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
37710 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
37720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
37730 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
37740 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
37750 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
37760 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
37770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
37790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
377a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
377b0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
377c0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
377d0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
377e0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
377f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37810 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
37820 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37830 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
37840 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
37850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37860 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
37870 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
37880 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
37890 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
378a0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
378b0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
378c0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
378d0 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
378e0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
378f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
37900 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
37910 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
37920 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
37930 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
37940 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
37950 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
37960 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
37970 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
37980 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
37990 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
379a0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
379b0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
379c0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
379d0 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
379e0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
379f0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
37a00 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37a10 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
37a20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
37a30 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
37a40 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
37a50 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
37a60 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
37a70 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
37a80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53    if( pPager->nS
37a90 61 76 65 70 6f 69 6e 74 3e 30 20 26 26 20 73 75  avepoint>0 && su
37aa0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
37ab0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
37ac0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
37ad0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
37ae0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
37af0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
37b00 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
37b10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
37b20 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
37b30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
37b40 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
37b50 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
37b60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
37b70 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
37b80 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
37b90 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
37ba0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
37bb0 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
37bc0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
37bd0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
37be0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
37bf0 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
37c00 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
37c10 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
37c20 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
37c30 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
37c40 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
37c50 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
37c60 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
37c70 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
37c80 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
37c90 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
37ca0 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
37cb0 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
37cc0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
37cd0 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
37ce0 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
37cf0 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
37d00 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
37d10 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
37d20 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
37d30 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
37d40 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
37d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
37d60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
37d70 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
37d80 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
37d90 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
37da0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
37db0 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
37dc0 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
37dd0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
37de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
37df0 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
37e00 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
37e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37e20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
37e30 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
37e40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
37e50 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72  pPager;..  asser
37e60 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  t( (pPg->flags &
37e70 20 50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20   PGHDR_MMAP)==0 
37e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37e90 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
37ea0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37ec0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
37ed0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
37ee0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37ef0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37f00 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ) );..  if( pPag
37f10 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3e  er->sectorSize >
37f20 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
37f30 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 50 67  geSize ){.    Pg
37f40 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
37f50 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
37f60 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
37f70 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
37f80 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
37f90 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
37fa0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
37fb0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
37fc0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
37fd0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
37fe0 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
37ff0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
38000 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
38010 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
38020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
38030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38040 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
38050 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65  r */.    int nee
38060 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  dSync = 0;      
38070 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
38080 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
38090 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20 20  _NEED_SYNC */.  
380a0 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
380b0 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
380c0 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
380d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
380e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
380f0 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
38100 20 62 69 74 20 74 6f 20 31 2e 20 54 68 69 73 20   bit to 1. This 
38110 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
38120 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a  nnot allow.    *
38130 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  * a journal head
38140 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
38150 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
38160 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a  es journaled by.
38170 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
38180 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
38190 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
381a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
381b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
381c0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
381d0 4f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  OSYNC)==0 );.   
381e0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
381f0 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
38200 5f 4e 4f 53 59 4e 43 3b 0a 0a 20 20 20 20 2f 2a  _NOSYNC;..    /*
38210 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
38220 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
38230 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
38240 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
38250 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
38260 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
38270 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
38280 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
38290 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
382a0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
382b0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
382c0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
382d0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
382e0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
382f0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
38300 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
38310 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61  nPageCount = pPa
38320 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
38330 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
38340 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
38350 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
38360 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
38370 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
38380 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
38390 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
383a0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
383b0 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
383c0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
383d0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
383e0 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
383f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
38400 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
38410 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
38420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
38430 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
38440 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
38450 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
38460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
38470 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
38480 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
38490 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
384a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
384b0 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
384c0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
384d0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
384e0 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
384f0 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
38500 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
38510 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
38520 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38530 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
38540 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
38550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38570 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
38580 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
38590 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
385a0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
385b0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
385c0 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
385d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
385e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
385f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
38600 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
38610 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
38620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38630 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
38640 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
38650 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
38660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
38670 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
38680 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
38690 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
386a0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
386b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
386c0 50 61 67 65 72 55 6e 72 65 66 4e