/ Hex Artifact Content
Login

Artifact eb6d272f4dc1ade4b8f664599cd54a9c95cb2729:


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 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d  lite3_int64 mxMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  f../*.** The mac
8fb0: 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74  ro USEFETCH is t
8fc0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  rue if we are al
8fd0: 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65  lowed to use the
8fe0: 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66   xFetch and xUnf
8ff0: 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63  etch.** interfac
9000: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9010: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
9020: 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
9030: 4f 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  O..*/.#ifdef SQL
9040: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4d 4d 41 50  ITE_DISABLE_MMAP
9050: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9060: 43 48 28 78 29 20 30 0a 23 65 6c 73 65 0a 23 20  CH(x) 0.#else.# 
9070: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9080: 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74  x) ((x)->bUseFet
9090: 63 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ch).#endif../*.*
90a0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
90b0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
90c0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
90d0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
90e0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
90f0: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  647../*.** The a
9100: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9110: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
9120: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
9130: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
9140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9150: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
9160: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
9170: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
9180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9190: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
91a0: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
91b0: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
91c0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
91d0: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
91e0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
91f0: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
9200: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
9210: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
9220: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
9230: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29  (pFd)->pMethods)
9240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9250: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9260: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
9270: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
9280: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
9290: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
92a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
92b0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
92c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
92d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
92e0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
92f0: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9300: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9310: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9320: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9330: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9340: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9350: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9360: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9370: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9380: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9390: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
93a0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
93b0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
93c0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
93d0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
93e0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
93f0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9400: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9410: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9420: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9430: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9440: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9450: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9460: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9470: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9480: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9490: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
94a0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
94b0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
94c0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
94d0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
94e0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
94f0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9500: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9510: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9520: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9530: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9540: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9550: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9560: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9570: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9580: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9590: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
95a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
95b0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
95c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
95d0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
95e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
95f0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9600: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9610: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9620: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9630: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9640: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9650: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9660: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9670: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9680: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9690: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
96a0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
96b0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
96c0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
96d0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
96e0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
96f0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9700: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9710: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9720: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9730: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9740: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9750: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9760: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9770: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9780: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9790: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
97a0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
97d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
97e0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
97f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9800: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9810: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9820: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9830: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9840: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9850: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9860: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9870: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9880: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9890: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
98a0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
98b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
98c0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
98d0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
98e0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
98f0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9900: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9910: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9940: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9950: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9960: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9970: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9980: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9990: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
99a0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
99b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
99c0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
99e0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
99f0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9a00: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9a10: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9a20: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9a30: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9a40: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9a50: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a70: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9a80: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9aa0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ab0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9ae0: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9af0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9b00: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9b10: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9b20: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9b30: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9b40: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9b50: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9b60: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9b70: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9b80: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9b90: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9ba0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9bb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9bc0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9be0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9bf0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9c00: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9c10: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9c20: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9c30: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9c40: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9c50: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9c80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9c90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ca0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9cb0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9cc0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9cd0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9ce0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9cf0: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9d10: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9d20: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d40: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d60: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9d70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9d80: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9d90: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9da0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9db0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9dc0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9de0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9df0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e00: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e10: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9e20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e30: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9e40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9e50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e60: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9e80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9e90: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9ea0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9eb0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9ec0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ed0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ee0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9ef0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9f10: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9f20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9f40: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9fd0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9fe0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9ff0: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a000: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a020: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a030: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a040: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a050: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a060: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a070: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a080: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a090: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a0a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a0b0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0d0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a0f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a100: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a110: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a120: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a130: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a150: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a160: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a170: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a190: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a1a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a1b0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a1e0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a1f0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a220: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a230: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a240: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a260: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a270: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a280: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a290: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a2e0: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a320: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a330: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a340: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a350: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a370: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a380: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a390: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a3a0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a3b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a3c0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3d0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a3e0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a400: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a410: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a420: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a430: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a450: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a460: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a470: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a480: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a4a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a4b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a4c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a4f0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a500: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a510: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a520: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a530: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a540: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a550: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a560: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a570: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a580: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a590: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a5a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5c0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a5d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a5f0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a600: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a620: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a640: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a660: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a670: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a680: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a690: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a6a0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a6b0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a6c0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a6d0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a6e0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a6f0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a700: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a710: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a720: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a730: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a740: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a750: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a760: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a770: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a780: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a790: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a7a0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a7b0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a7c0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a7d0: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a7e0: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a7f0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a800: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a810: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a820: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a830: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a840: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a850: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a860: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a870: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a880: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a890: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a8a0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a8b0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a8c0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a8d0: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a8e0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a8f0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a900: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a910: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a920: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a930: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a940: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a950: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a960: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a970: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a980: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a990: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a9a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a9b0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a9c0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a9d0: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a9e0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
aa00: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
aa10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa30: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
aa40: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
aa50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa70: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
aa80: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
aa90: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
aaa0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
aab0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
aac0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
aad0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aae0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
aaf0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ab00: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ab10: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ab20: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ab30: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ab40: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ab50: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ab60: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ab70: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ab80: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ab90: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
aba0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
abb0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
abc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
abd0: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
abe0: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ac00: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ac10: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ac20: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ac30: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ac40: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ac50: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ac60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
ac80: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
ac90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aca0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
acb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
acc0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
acd0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ace0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
acf0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ad00: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ad10: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ad20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ad30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ad40: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
ad50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ad60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
ad80: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
ad90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
ada0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
adb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
adc0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
add0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ade0: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
adf0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ae00: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ae10: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ae20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ae30: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ae40: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
ae50: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
ae60: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
ae70: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
ae80: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ae90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
aea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
aeb0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
aec0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
aed0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
aee0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
aef0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
af00: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
af10: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
af20: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
af30: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
af40: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
af50: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
af60: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
af70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
af80: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
af90: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
afa0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
afb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
afc0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
afd0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
afe0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
aff0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b010: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b020: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b030: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b040: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
b050: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b060: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
b070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b080: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b090: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
b0a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
b0b0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b0c0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b0d0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b0e0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b0f0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b100: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b130: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b140: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b150: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b160: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b170: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b180: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b190: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
b1a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b1b0: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b1c0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b1d0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b1f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b200: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b220: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b230: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b240: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b260: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b270: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b280: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b290: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b2a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b2b0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b2c0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b2d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b2e0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b2f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b300: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b310: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b330: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b340: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b350: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b360: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b380: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b390: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b3c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b3d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b3e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b3f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b400: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b410: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b420: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b430: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b440: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b450: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b470: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b480: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b490: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b4a0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b4b0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b4d0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b4e0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b4f0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b500: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b510: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b520: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b530: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b540: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b550: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b560: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b570: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b580: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b590: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b5a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b5b0: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b5c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b5d0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b5e0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b5f0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b600: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b610: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b620: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b630: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b640: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b650: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b660: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b670: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b680: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b690: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b6a0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b6b0: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b6c0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b6d0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b6e0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b6f0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b700: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b710: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b720: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b730: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b740: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b750: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b760: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b770: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b780: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b790: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b7b0: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b7c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b7d0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b7e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b7f0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b800: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b810: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b820: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b830: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b840: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b850: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b860: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b870: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b880: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b890: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b8a0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b8b0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b8c0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b8e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b8f0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b900: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b910: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b920: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b930: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b940: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b950: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b960: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b970: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b980: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b990: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b9a0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b9b0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b9c0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b9d0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b9e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b9f0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
ba00: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
ba10: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
ba20: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
ba30: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
ba40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
ba50: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
ba60: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
ba70: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
ba80: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
ba90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
baa0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bab0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bac0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bad0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bae0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
baf0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bb00: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bb10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
bb20: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
bb30: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
bb40: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
bb50: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
bb60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
bb70: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bb80: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bba0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bbb0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bbc0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bbd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bbe0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bbf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bc00: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bc10: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bc20: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bc30: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bc50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bc60: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bc70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc80: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bc90: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bca0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bcb0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bcc0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bcd0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bce0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bcf0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bd00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bd10: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bd20: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bd30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bd40: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bd50: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bd60: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bd70: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bd80: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bd90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bda0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bdb0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bdc0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bdd0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bde0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bdf0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
be00: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
be10: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
be20: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
be30: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
be40: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
be50: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
be60: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
be70: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
be80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
be90: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bea0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
beb0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bec0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bee0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bef0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bf00: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bf10: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bf20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bf30: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bf40: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bf50: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bf60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bf70: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bf80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bf90: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
bfc0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
bfd0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
bfe0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c000: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c010: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c040: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c050: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c060: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c070: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c080: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c090: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c0a0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c0b0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c0c0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c0d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c0e0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c0f0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c100: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c110: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c120: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c130: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c140: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c150: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c160: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c170: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c180: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c1a0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c1b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c1c0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c1d0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c1e0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c1f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c200: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c210: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c220: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c230: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c240: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c260: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c270: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c280: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c290: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c2a0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c2b0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c2c0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c2e0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c2f0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c300: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c310: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c320: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c330: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c340: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c350: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c360: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c370: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c390: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c3a0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c3b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c3c0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c3d0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c3e0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c3f0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c400: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c410: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c420: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c430: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c440: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c460: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c470: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c480: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c490: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c4a0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c4b0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c4c0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c4d0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c4e0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c4f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c500: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c510: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c520: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c530: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c540: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c550: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c560: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c570: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c580: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c590: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c5a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c5b0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c5c0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c5d0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c5e0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c5f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c600: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c610: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c620: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c630: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c640: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c650: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c660: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c670: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c680: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c690: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c6a0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c6b0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c6c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c6e0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c6f0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c700: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c710: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c730: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c740: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c750: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c760: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c770: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c780: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c790: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c7a0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c7b0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c7c0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c7d0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c7e0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c7f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c800: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c810: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c820: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c830: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c840: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c850: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c860: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c870: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c880: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c890: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c8a0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c8b0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c8c0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c8d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c8e0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c8f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c900: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c910: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c920: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c930: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c940: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c950: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c960: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c980: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c990: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c9a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c9b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c9c0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c9d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c9f0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
ca00: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ca10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ca20: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ca30: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
ca40: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ca50: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
ca60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
ca70: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
ca80: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
ca90: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
caa0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cac0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cad0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cae0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
caf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cb00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cb10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cb20: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cb40: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cb50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cb60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cb70: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cb80: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cb90: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cba0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cbb0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cbc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cbd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cbe0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cbf0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cc00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cc10: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cc20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc30: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc50: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cc60: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cc70: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cc80: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cca0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
ccb0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ccc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
ccf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cd00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cd10: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cd20: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cd30: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cd40: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cd50: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cd60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cd70: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cd80: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cd90: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cda0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cdb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cdc0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cdd0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cde0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ce00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
ce10: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
ce20: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
ce30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
ce40: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
ce50: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ce60: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ce70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ce80: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
ce90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cea0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ceb0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cec0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
ced0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cee0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cef0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cf00: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cf10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cf20: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cf30: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cf40: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cf50: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cf60: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cf70: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cf80: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cf90: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cfa0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
cfb0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
cfc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
cfd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
cfe0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
cff0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d000: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d010: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d020: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d030: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d040: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d050: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d060: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d070: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d080: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d090: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d0a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d0c0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d0d0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d0e0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d0f0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d100: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d110: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d120: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d130: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d140: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d150: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d160: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d170: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d180: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d190: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d1a0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d200: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d210: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d220: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d230: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d240: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d260: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d270: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d280: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d290: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d2a0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d2b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d2c0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d2d0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d2e0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d2f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d300: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d310: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d320: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d350: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d370: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d380: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d3a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d3b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d3c0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d3e0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d400: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d420: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d430: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d440: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d450: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d470: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d480: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d490: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d4a0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4b0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d4c0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d4d0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d4e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d4f0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d510: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d520: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d530: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d540: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d550: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d560: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d570: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d580: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d590: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d5a0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d5b0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d5c0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d5d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d5e0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d5f0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d600: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d610: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d620: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d630: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d640: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d650: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d660: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d670: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d680: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d690: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d6a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d6b0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d6c0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d6d0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d6e0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d6f0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d710: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d720: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d730: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d740: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d750: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d760: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d770: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d780: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d790: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d7a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d7b0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d7c0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d800: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d820: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d830: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d840: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d850: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d870: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d880: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d890: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d8a0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d8b0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d8c0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d8d0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d920: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d930: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d940: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d950: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d970: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d980: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d990: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d9a0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d9b0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d9c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9d0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d9e0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d9f0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
da00: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
da10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
da20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
da30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
da40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
da50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
da60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
da70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
da80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
da90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
daa0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dab0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dac0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
dad0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
dae0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
daf0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
db00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
db10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
db20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
db30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
db40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
db50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
db60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
db70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
db80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
db90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dba0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dbb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dbc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
dbd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
dbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dbf0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
dc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc10: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc20: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dc60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dc70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dc80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dc90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
dca0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
dcb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
dcc0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
dcd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dce0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
dcf0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
dd00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
dd10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
dd20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
dd30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
dd40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dd50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dd60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dd70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dd80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dd90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dda0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
ddb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
ddc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
ddd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dde0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
ddf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
de00: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
de10: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
de20: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
de30: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
de40: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
de50: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
de60: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
de70: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
de80: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
de90: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dea0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
deb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dec0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
ded0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dee0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
def0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
df10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
df20: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
df30: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
df40: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
df50: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
df60: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
df70: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
df80: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
df90: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
dfa0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
dfb0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
dfc0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dfe0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
dff0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e000: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e030: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e040: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e050: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e060: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e070: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e080: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e090: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e0a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e0b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e0c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e0e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e0f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e100: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e110: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e120: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e130: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e140: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e150: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e160: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e170: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e180: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e190: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e1a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e1b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e1c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e1d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e1e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e1f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e200: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e220: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e240: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e250: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e260: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e270: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e280: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e290: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e2a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e2b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e2c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e2d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e2e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e2f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e300: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e310: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e320: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e330: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e340: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e350: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e360: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e370: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e380: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e390: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e3a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e3b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e3c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e3d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e3e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e3f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e400: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e410: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e430: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e440: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e450: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e460: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e470: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e480: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e490: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e4a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e4b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e4c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e4d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e4f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e500: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e510: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e520: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e530: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e540: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e550: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e560: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e570: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e580: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e590: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e5a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e5b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e5c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e5d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e5e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e5f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e600: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e610: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e620: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e630: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e640: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e650: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e660: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e670: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e680: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e6a0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e6b0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e6c0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e6d0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e6e0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e6f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e700: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e710: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e720: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e730: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e750: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e760: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e770: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e780: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e790: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e7a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e7b0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e7c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e7d0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e7e0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e7f0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e800: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
e810: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e820: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e830: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e840: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e850: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e860: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e870: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e880: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e890: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e8a0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e8b0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e8c0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e8d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e8e0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e8f0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e900: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e910: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e920: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e930: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e940: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e950: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e960: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e970: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e980: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e990: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e9a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e9b0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e9c0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e9d0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e9e0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e9f0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ea00: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ea10: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ea20: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ea30: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ea40: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ea50: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ea60: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
ea70: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ea80: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ea90: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eaa0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eab0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eac0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ead0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eaf0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
eb00: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eb20: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eb30: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eb50: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eb60: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eb70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
eb80: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
eb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
eba0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ebb0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ebc0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ebd0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ebe0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ebf0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ec00: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ec10: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ec20: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ec30: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ec40: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
ec50: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
ec60: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
ec70: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ec80: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
ec90: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eca0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
ecb0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
ecc0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
ecd0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
ece0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
ecf0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
ed00: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
ed10: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
ed20: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
ed30: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed40: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
ed50: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ed60: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ed70: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ed80: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ed90: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
eda0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
edb0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
edc0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
edd0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ede0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
edf0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ee00: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ee10: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ee20: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ee30: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ee40: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
ee50: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ee60: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ee70: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ee80: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ee90: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
eea0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
eeb0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
eec0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
eed0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
eee0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
eef0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ef00: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ef10: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ef20: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ef30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ef40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef50: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
ef60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ef70: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
ef80: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ef90: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
efa0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
efb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
efc0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
efd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
efe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
eff0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f000: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f030: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f040: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f050: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f060: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f070: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f080: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f090: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f0a0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f0b0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f0e0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f0f0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f100: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f110: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f120: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f130: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f140: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f150: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f160: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f170: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f180: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f190: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f1a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f1b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f1c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f1d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f1e0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f1f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f200: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f210: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f220: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f230: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f240: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f250: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f260: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f270: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f280: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f290: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f2a0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f2c0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f2d0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f2e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f2f0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f300: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f310: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f320: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f330: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f340: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f350: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f360: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f390: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f3a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f3c0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f3d0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f3e0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f400: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f410: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f420: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f430: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f440: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f450: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f460: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f470: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f490: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f4a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f4b0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f4c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f4f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f500: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f510: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f520: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f530: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f540: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f560: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f570: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f580: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f590: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f5a0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f5c0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f5d0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f5f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f600: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f610: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f620: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f630: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f640: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f650: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f660: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f670: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f690: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f6a0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f6b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f6c0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f6d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f6e0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f6f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f700: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f710: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f730: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f740: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f760: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f770: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f780: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f790: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f7a0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f7b0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f7c0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f7d0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f7e0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f7f0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f800: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f810: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f820: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f830: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f840: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f860: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f870: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f880: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f8d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f8e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f8f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f900: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f920: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f930: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f940: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f950: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f960: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f970: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f980: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f990: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f9a0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f9b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f9c0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f9d0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f9e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fa00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fa10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fa20: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fa30: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fa40: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fa50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa60: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fa70: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fa80: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fa90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
faa0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fab0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fac0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fae0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
faf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fb00: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fb10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fb20: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
fb30: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fb40: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fb50: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
fb80: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
fb90: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
fba0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fbb0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fbc0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fbd0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fbe0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc10: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fc20: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fc30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fc40: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fc50: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fc60: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fc70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fc80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fc90: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
fca0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fcb0: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fcc0: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fcd0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fce0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fcf0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fd00: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fd10: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fd20: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fd30: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fd40: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fd50: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fd60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fd70: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fd80: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fd90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fda0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fdb0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fdc0: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fdd0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fde0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fdf0: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fe00: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fe10: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fe20: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fe30: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fe40: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fe50: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fe60: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fe70: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fe80: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fe90: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fea0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
feb0: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fec0: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fed0: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fef0: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
ff00: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
ff10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ff20: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
ff30: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
ff40: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
ff50: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
ff60: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
ff70: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
ff80: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
ff90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ffa0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
ffb0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
ffc0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
ffd0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
ffe0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fff0: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10000 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10010 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10020 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10030 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10040 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10050 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10060 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10070 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10090 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
100a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
100b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
100c0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
100d0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
100e0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
100f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10100 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10110 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10120 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10130 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10140 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10150 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10160 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10170 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10190 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
101a0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
101b0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
101c0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
101d0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
101e0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
101f0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10200 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10210 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10220 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10230 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10240 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10250 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10260 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10270 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10280 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10290 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
102a0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
102b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
102c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
102d0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
102e0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
102f0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10300 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10310 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10320 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10330 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10340 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10350 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10370 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10380 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10390 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
103a0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
103b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
103d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
103e0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
103f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10400 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10410 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10420 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10430 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10440 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10450 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10460 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10470 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10490 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
104a0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
104b0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
104c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
104d0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
104e0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
104f0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10500 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10510 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10530 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10540 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10550 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10560 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10570 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10580 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10590 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
105a0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
105b0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
105c0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
105d0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
105e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
105f0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10600 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10610 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10620 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10630 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10640 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10650 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10660 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10670 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10680 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10690 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
106a0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
106b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
106c0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
106d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
106e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
106f0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10720 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10750 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10760 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10780 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10790 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
107a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
107d0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
107e0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
107f0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10810 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10820 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10830 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10860 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10870 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10880 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
108a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
108b0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
108c0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
108d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
108e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
108f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10900 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10910 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
10950 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10960 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
10970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
10980 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
10990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
109a0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
109b0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
109c0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
109d0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
109e0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
109f0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10a00 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10a10 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10a20 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10a30 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10a40 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10a60 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10a70 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10a80 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10a90 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10aa0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10ab0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10ac0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10ad0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ae0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10af0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10b00 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10b20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10b40 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10b50 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10b60 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10b70 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10b80 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10b90 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10ba0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10bc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10bd0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10be0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10bf0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10c00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10c10 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10c20 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10c30 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10c40 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10c50 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10c60 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10c70 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10c80 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10c90 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10ca0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10cb0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10cc0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10cd0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ce0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10cf0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10d00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10d10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10d20 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10d30 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10d40 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10d50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10d60 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10d70 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10d80 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10d90 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10da0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10dc0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10dd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10de0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10df0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10e00 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10e10 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10e20 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10e30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10e40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10e50 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10e60 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10e70 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10e80 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10e90 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10ea0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10eb0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10ec0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10ed0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10ee0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10ef0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10f00 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10f20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10f30 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10f40 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10f50 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10f60 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10f70 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10f80 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10f90 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10fa0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10fb0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10fc0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10fd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10ff0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11000 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11030 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11040 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11050 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11070 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11080 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11090 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
110a0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
110b0 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
110c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
110d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
110e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
110f0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
11100 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11110 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
11120 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
11130 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11140 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11170 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11180 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11190 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
111a0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
111b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
111c0 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
111d0 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
111e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
111f0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11200 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11210 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11220 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11230 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11240 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11250 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11260 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11270 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11280 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11290 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
112a0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
112c0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
112d0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
112e0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
112f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11320 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11330 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11340 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11350 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11360 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11370 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11380 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11390 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
113a0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
113b0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
113c0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
113d0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
113e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
113f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11410 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11420 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11430 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11440 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11450 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11460 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11470 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11480 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11490 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
114a0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
114b0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
114c0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
114d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
114e0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
114f0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11500 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11510 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11520 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11540 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11550 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11560 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11570 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11580 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11590 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
115a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
115b0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
115c0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
115d0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
115e0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
115f0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11600 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11610 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11620 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11640 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11650 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11660 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11670 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11680 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11690 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
116a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
116b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
116d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
116e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
116f0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11700 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11710 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11720 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11730 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11740 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11750 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11760 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11770 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11780 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11790 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
117a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
117b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
117c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
117d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
117f0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11820 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11830 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11840 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11850 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11860 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11870 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11880 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11890 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
118a0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
118b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
118c0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
118d0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
118e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
118f0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11900 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11910 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11920 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11930 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11940 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11950 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11960 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11980 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11990 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
119a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
119b0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
119c0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
119d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
119e0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
119f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11a00 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11a10 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11a20 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11a30 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11a40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11a50 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11a60 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11a70 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11a80 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11a90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11aa0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11ab0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11ac0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11ad0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ae0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11af0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11b00 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11b10 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11b20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11b40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11b70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11b80 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11ba0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11bb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11bc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11bd0 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11be0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11bf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11c00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11c10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11c20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11c30 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11c40 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11c50 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11c60 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11c80 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11c90 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11ca0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11cb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11cc0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11cd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ce0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11cf0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11d00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11d20 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11d30 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11d40 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11d50 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11d60 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11d70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11d80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11d90 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11da0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11db0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11dc0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11dd0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11de0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11df0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11e00 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11e10 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11e20 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11e30 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11e40 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11e50 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11e60 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11e70 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11e80 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11e90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ea0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11eb0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11ed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11ee0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11ef0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f00 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f10 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11f20 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f30 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11f40 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11f50 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11f60 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11f70 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11f80 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11f90 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11fa0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11fb0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11fc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11fd0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11fe0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11ff0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12000 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12010 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12030 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12040 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12050 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12060 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12070 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12080 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12090 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
120a0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
120b0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
120c0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
120d0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
120e0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
120f0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12100 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12110 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12120 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12130 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12150 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12160 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12170 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12190 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
121a0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
121b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
121c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
121d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
121e0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
121f0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12200 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12210 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12220 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12230 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12240 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12250 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12260 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12270 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12280 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12290 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
122a0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
122b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
122c0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
122d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
122e0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
122f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12300 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12320 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12330 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12340 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12350 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12360 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12370 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12380 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12390 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
123a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
123b0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
123c0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
123d0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
123e0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
123f0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12400 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12410 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12420 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12440 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12450 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12460 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12470 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12480 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12490 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
124a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
124b0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
124c0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
124d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
124e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
124f0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12500 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12530 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12560 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12570 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
12580 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
12590 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125a0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125b0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125c0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125d0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
125e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
125f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12600 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12610 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12620 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12630 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12640 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12650 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12660 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12670 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
12680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12690 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126a0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126c0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
126e0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
126f0 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12700 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12710 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12720 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12730 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12740 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12750 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12760 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12770 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12780 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
12790 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127a0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127b0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127c0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127d0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
127e0 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
127f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12800 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12810 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12820 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12830 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12840 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12850 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12860 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12870 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
12880 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
12890 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128a0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128b0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
128e0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
128f0 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12900 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12920 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12930 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12940 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12950 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12960 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12970 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
12980 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
12990 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129b0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129d0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
129e0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
129f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a10 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a20 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a30 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a50 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a60 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12a80 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12a90 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12aa0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12ad0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12ae0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12af0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b00 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b30 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b40 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b50 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b60 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b70 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12b80 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12b90 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12bc0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12be0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12bf0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c20 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c60 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c70 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12c80 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12c90 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12ca0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cb0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12cc0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cd0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12cf0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d00 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d10 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d40 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d50 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d60 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d70 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12d80 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12d90 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12db0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12dc0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12dd0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12df0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e10 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e20 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e30 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e40 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e60 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e80 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12e90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ea0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12eb0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ec0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12ee0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12ef0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f00 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f10 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f20 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f40 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f50 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f60 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f70 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12f80 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12f90 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fa0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fb0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fc0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12fe0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12ff0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13000 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13010 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13020 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13030 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13040 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13050 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13070 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13080 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13090 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130a0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130c0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130d0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
130e0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
130f0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13100 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13110 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13120 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13130 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13150 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13160 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13170 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13180 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13190 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131b0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131c0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131d0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
131e0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
131f0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13200 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13210 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13220 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13230 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13240 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13250 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13260 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13270 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13280 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13290 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132d0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
132e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
132f0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13300 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13310 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13330 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13340 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13350 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13360 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13370 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13380 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13390 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133a0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133b0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133c0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
133e0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
133f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13400 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13410 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13420 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13430 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13440 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13450 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13460 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13470 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
13480 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
13490 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134c0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134d0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
134e0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
134f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13500 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13510 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13520 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13530 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13540 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13550 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13560 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13570 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13580 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13590 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135b0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135d0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
135e0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
135f0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13600 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13610 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13620 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13630 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13640 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13650 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13660 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13670 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13680 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13690 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136a0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136c0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136d0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
136e0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
136f0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13700 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13710 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13720 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13730 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13740 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13750 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13760 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13770 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13780 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13790 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137a0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137b0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137d0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
137e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
137f0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13800 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13810 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13820 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13830 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13840 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13850 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13870 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13880 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138a0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138b0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138c0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
138e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
138f0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13900 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13920 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13930 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13940 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13950 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13960 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13970 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13980 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13990 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139c0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
139e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
139f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a10 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a30 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a70 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13a80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13ae0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13af0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b00 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b50 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b60 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13bc0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bd0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13be0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13bf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c20 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c30 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c40 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c50 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c60 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13c80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13c90 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13ca0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cb0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13cc0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cd0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ce0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13cf0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d00 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d20 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d30 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d40 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d50 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d60 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13da0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13db0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13dc0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13dd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13df0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e30 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e40 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e60 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13e80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13e90 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ec0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ed0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13ee0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ef0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f00 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f10 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f30 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f60 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f70 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13f80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13f90 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fa0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13fe0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13ff0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14010 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14020 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14030 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14040 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14050 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14060 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
14070 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14080 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
140a0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
140b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
140c0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
140d0 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
140e0 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
140f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14100 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14110 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14120 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14130 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14140 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14150 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14160 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14170 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14180 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14190 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
141a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
141b0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
141c0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
141d0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141f0 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14200 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14220 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14230 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14240 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14260 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14270 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14290 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
142a0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
142b0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
142c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
142d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
142e0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
142f0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14300 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14310 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14320 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14330 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14340 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14350 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14360 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
14370 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
14380 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
14390 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
143a0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
143b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
143c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
143d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
143e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
143f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14400 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14410 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14420 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14430 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
14440 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
14450 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
14460 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
14470 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
14480 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
14490 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
144a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
144b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
144c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
144d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
144e0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
144f0 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
14500 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
14510 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
14520 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
14530 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14540 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
14550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14560 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
14570 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14580 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
14590 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
145a0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
145b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
145c0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
145d0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
145e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
145f0 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14600 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14610 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14620 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14630 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
14640 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
14650 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
14660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14670 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
14680 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
14690 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
146a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
146b0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
146c0 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
146d0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
146e0 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
146f0 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14700 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14710 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14720 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
14730 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
14740 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
14750 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14760 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
14770 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14780 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14790 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
147a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
147b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
147c0 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
147d0 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
147e0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
147f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14800 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14810 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14820 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14830 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
14840 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
14850 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14860 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14870 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
148a0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
148b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
148c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
148d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
148e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
148f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14910 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14920 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14940 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14950 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14970 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14990 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
149a0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
149b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
149d0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
149e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
149f0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  tion(pPager, 0, 
14a00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
14a10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
14a20 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
14a30 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
14a40 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
14a50 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
14a60 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14a70 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14a80 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14a90 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14aa0 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14ab0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14ac0 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14ad0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14ae0 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14af0 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14b00 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
14b10 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
14b20 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
14b30 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
14b40 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
14b50 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
14b60 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14b70 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14b80 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14b90 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14ba0 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14bb0 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14bc0 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14bd0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14be0 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14bf0 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14c00 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
14c10 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
14c20 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
14c30 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
14c40 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
14c50 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
14c60 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14c70 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14c80 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14c90 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14ca0 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14cb0 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14cc0 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14cd0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14ce0 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14cf0 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14d00 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
14d10 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
14d20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
14d30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
14d40 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
14d50 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
14d60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14d70 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14d80 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14d90 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14da0 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14db0 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14dc0 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14dd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14de0 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14e00 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
14e10 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
14e20 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
14e30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
14e40 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
14e50 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
14e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14e70 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14e80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14e90 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14ea0 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14eb0 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14ec0 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14ed0 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14ee0 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14ef0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14f00 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
14f10 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
14f20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
14f30 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
14f40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14f60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14f70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14f80 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14f90 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14fa0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14fb0 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14fc0 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14fd0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
15000 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
15010 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15020 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
15030 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
15040 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
15050 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
15060 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
15070 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
15080 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
15090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
150a0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
150b0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
150c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
150d0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
150e0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
150f0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
15100 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
15110 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
15120 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
15130 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
15140 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
15150 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
15160 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
15180 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
15190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
151a0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
151b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
151c0 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
151d0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
151e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
151f0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15200 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15210 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15220 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
15230 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15240 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
15250 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
15260 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
15270 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
15280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15290 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
152a0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
152b0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
152c0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
152d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
152e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
152f0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
15300 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
15310 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
15320 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
15330 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
15340 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
15350 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
15360 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
15370 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
15380 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
15390 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
153a0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
153b0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
153c0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
153d0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
153e0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
153f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15410 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
15420 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15450 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
15460 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
15470 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15480 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
15490 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
154a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
154b0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
154c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
154d0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
154e0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
154f0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
15500 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15510 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
15520 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
15530 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
15540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
15550 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
15560 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
15570 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
15580 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
15590 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
155a0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
155b0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
155c0 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
155d0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
155e0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
155f0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15600 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
15610 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
15620 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
15630 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15640 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
15650 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
15660 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15670 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15680 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15690 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
156a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
156b0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
156c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
156d0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
156e0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
156f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15710 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15720 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
15730 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
15740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
15750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15760 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15770 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
157b0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
157c0 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
157d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
157e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
157f0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15800 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
15810 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
15820 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
15830 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
15840 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15850 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15880 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15890 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
158a0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
158b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
158c0 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
158d0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
158e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
158f0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15910 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
15920 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
15930 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15950 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
15960 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15970 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15980 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
159a0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
159b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
159c0 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
159f0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15a00 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
15a10 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
15a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
15a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
15a40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
15a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
15a60 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15a70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15a80 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15a90 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15aa0 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15ab0 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15ac0 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15ad0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15ae0 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15af0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15b00 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
15b10 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
15b20 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
15b30 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
15b40 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
15b50 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
15b60 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15b70 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15b80 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15b90 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15ba0 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15bb0 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15bc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15bd0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15be0 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15bf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15c00 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
15c10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
15c20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
15c30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
15c40 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
15c50 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
15c60 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15c70 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15c80 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15c90 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15ca0 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15cb0 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15cc0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15cd0 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15ce0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15cf0 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15d00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
15d10 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
15d20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15d30 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
15d40 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
15d50 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
15d60 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15d70 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15d80 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15d90 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15da0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15db0 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15dc0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15de0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15df0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15e00 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
15e10 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
15e20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
15e30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15e40 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
15e50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15e60 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15e70 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15e80 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15e90 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15ea0 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15eb0 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15ec0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15ed0 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15ee0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15ef0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15f00 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
15f10 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
15f20 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
15f30 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
15f40 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
15f50 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
15f60 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15f70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15f90 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15fa0 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15fb0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15fd0 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15ff0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16000 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
16010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
16020 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
16030 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
16040 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
16050 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
16060 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
16070 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
16080 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
16090 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
160a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
160b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
160c0 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
160d0 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
160e0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
160f0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
16100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
16110 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
16120 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
16130 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
16140 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
16150 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
16160 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
16170 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
16180 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
16190 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
161a0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
161b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161c0 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
161d0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
161e0 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
161f0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
16200 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
16210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16220 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
16230 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
16240 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
16250 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
16260 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
16270 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16280 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
16290 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
162a0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
162b0 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
162c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
162d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
162e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
162f0 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
16300 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
16310 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
16320 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16330 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16340 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16350 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16360 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16370 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16380 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
16390 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
163a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
163b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
163c0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
163d0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
163e0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
163f0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16400 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16410 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16420 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16430 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16440 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16450 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16460 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16470 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16490 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
164a0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
164b0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
164c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
164d0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
164e0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
164f0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16500 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16510 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16530 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16540 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16550 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16560 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16570 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16580 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
16590 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
165a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
165b0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
165c0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
165d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
165e0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
165f0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16600 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16610 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16620 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16630 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16640 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16650 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16660 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16670 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16680 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16690 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
166a0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
166b0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
166c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
166d0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
166e0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
166f0 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16700 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16710 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16720 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16730 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16740 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16750 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16760 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16770 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16780 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16790 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
167a0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
167b0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
167c0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
167d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
167e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
167f0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16800 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16810 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16820 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16830 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16840 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16850 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16860 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16870 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16880 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16890 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
168a0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
168b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
168c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
168d0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
168e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
168f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16900 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16910 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16920 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16930 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16940 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16950 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16960 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16970 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16980 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16990 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
169a0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
169b0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
169c0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
169d0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
169e0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
169f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16a00 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16a10 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16a20 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16a30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16a40 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16a50 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16a60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16a70 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16a80 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16a90 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16aa0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ab0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ac0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ad0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16af0 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16b00 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16b10 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16b20 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16b30 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16b40 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16b50 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16b70 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16b80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b90 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16ba0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16bb0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16bc0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16bd0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16be0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16bf0 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16c10 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
16c20 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
16c30 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
16c40 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
16c50 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
16c60 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16c70 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16c90 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16ca0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16cb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16cc0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16cd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16ce0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16cf0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16d00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16d10 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
16d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16d30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
16d40 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
16d50 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
16d60 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16d70 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16d80 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16d90 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16da0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16db0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16dc0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16dd0 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16de0 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16df0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16e00 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
16e10 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
16e20 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
16e30 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
16e40 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
16e50 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
16e60 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16e70 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16e80 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16e90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16ea0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16eb0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16ec0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16ed0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16ee0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16ef0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16f00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16f10 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
16f20 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
16f30 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
16f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16f50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
16f60 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16f70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16f80 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16f90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16fc0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16fd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16fe0 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
16ff0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17000 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
17010 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
17020 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17030 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17040 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
17050 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
17060 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
17070 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
17080 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
17090 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
170a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
170b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
170c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
170d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
170e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
170f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
17100 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
17110 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
17120 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
17130 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
17140 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
17150 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17160 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
17170 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17180 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
17190 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
171a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
171b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
171c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
171d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
171e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
171f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
17200 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
17210 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
17220 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
17230 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
17240 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17250 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
17260 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
17270 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
17280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17290 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
172a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
172b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
172c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
172d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
172e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
172f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
17300 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
17310 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
17320 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
17330 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17340 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17350 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17360 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
17370 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
17380 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
17390 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
173a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
173b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
173c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
173d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
173e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
173f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
17400 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
17410 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17420 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
17430 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
17440 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
17450 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
17460 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
17470 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
17480 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17490 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
174a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
174b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
174c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
174d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
174e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
174f0 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17500 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17510 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17520 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17530 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17540 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17560 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
17570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17580 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175b0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
175c0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
175d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
175e0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
175f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17600 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17610 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17620 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17630 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17640 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17650 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17660 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17670 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
17680 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17690 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
176a0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
176b0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
176c0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
176d0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
176e0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
176f0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17700 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17710 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17720 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17730 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17740 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17750 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17760 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17770 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
17780 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17790 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
177a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
177b0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
177c0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
177d0 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
177e0 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
177f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17810 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17820 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17830 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17840 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17850 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17860 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17870 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17880 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17890 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
178a0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
178b0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
178c0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
178d0 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
178e0 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
178f0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17900 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17910 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17920 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17930 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17940 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17950 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17960 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17970 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17980 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17990 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
179a0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
179b0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
179c0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
179d0 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
179e0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
179f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17a00 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17a10 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17a20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17a30 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17a40 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17a50 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17a60 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17a70 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17a80 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17a90 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17aa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17ab0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17ac0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17ad0 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17ae0 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17af0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17b00 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17b10 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17b20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17b30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17b40 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17b50 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17b60 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17b70 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17b80 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17b90 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17ba0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17bb0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17bc0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17bd0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17be0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17bf0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17c10 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17c20 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17c30 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17c40 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17c50 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17c60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17c70 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17c90 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17ca0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17cb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17cc0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17cd0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17ce0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17d00 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17d10 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17d20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17d30 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17d40 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17d50 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17d60 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
17d70 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
17d80 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17d90 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17da0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17dc0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17dd0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17de0 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17df0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17e00 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17e10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17e20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17e30 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17e40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17e50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17e60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
17e70 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
17e80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17eb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17ec0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17ed0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17ee0 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17ef0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17f00 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17f10 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17f20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17f30 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17f50 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17f60 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17f70 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17f80 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17f90 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17fa0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17fb0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17fc0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17fe0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17ff0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18000 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
18010 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18020 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
18030 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18040 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18050 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18060 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18070 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
18080 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
18090 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
180a0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
180b0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
180c0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
180d0 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
180e0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
180f0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
18100 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
18110 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18120 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
18130 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18140 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18150 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18160 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18170 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
18180 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
18190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
181a0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
181b0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
181c0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
181d0 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
181e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
181f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18200 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
18210 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18220 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
18230 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18240 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18250 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18260 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18270 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
18280 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
18290 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
182a0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
182b0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
182c0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
182d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
182e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
182f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
18310 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
18320 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
18330 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18340 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18350 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18360 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18370 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
18380 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
18390 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
183a0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
183b0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
183c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
183d0 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
183e0 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
183f0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
18400 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
18410 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
18420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
18430 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18440 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18460 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18470 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
18480 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18490 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
184a0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
184b0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
184c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
184d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
184e0 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
184f0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18500 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18510 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18520 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18530 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18540 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18550 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18560 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18570 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18590 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
185a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
185b0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
185c0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
185d0 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
185e0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
185f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18600 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18610 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18630 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18640 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18650 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18660 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18680 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18690 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
186a0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
186b0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
186c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
186d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
186e0 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
186f0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18700 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18710 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18720 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18730 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18740 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18750 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18760 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18770 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
18780 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18790 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
187a0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
187b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
187c0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
187d0 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
187e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
187f0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18800 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18810 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18820 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18830 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18840 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18850 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18860 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18870 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18890 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
188a0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
188b0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
188c0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
188d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
188e0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
188f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18900 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18910 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18920 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18930 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18940 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18950 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18960 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18970 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18980 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18990 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
189a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
189b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
189c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
189d0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
189e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
189f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18a00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18a20 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18a30 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18a40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18a60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a70 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18a80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18aa0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18ab0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18ac0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18ae0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18af0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18b00 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18b10 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18b20 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18b30 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18b40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18b50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18b60 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18b70 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b90 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18ba0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18bb0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18bc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18bd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18be0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18bf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18c00 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18c10 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18c20 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18c30 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18c40 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18c50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
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 20 20 67 6f 74  E_NOMEM;.    got
18c80 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c90 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18ca0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18cb0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18cc0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18cd0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18ce0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18cf0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18d00 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d20 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18d30 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18d40 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18d50 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18d60 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
18d70 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
18d80 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18d90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18da0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18db0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18dd0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18de0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18df0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18e00 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18e30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18e40 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18e50 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18e70 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
18e80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18e90 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18ea0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18eb0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18ec0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18ed0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18ee0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18ef0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18f00 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18f10 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18f20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18f30 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18f40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18f50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18f60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18f70 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18f80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18f90 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18fa0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18fd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18fe0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18ff0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19000 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19010 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19020 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19040 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19070 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19080 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19090 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
190a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
190b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
190c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
190d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
190e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
190f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19100 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19130 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19150 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19160 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19170 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19180 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19190 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
191a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
191b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
191c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
191d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
191e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
191f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19200 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19210 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19220 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19230 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19240 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19250 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19290 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
192a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
192b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
192c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
192d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
192e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
192f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19300 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19310 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19330 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19340 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19350 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19360 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19370 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19380 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19390 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
193a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
193b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
193c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
193d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
193e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
193f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19400 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19410 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19420 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19430 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19440 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19450 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19460 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19470 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19480 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19490 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
194a0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
194b0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
194c0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
194d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
194e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
194f0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19500 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19510 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19520 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19530 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19540 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19550 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19560 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19570 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
19580 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19590 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
195a0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
195b0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
195c0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
195d0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
195e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
195f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19610 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19620 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19630 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19640 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19650 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19660 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19680 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19690 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
196a0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
196b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
196c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
196d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
196e0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
196f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19700 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19710 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19720 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19730 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19740 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19750 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19770 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19780 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19790 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
197a0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
197b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
197c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
197d0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
197e0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
197f0 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19800 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19810 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19820 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19830 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19850 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19860 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19870 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19890 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
198a0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
198b0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
198c0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
198d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
198e0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
198f0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19900 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19910 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19920 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19940 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19950 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19970 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19990 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
199a0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
199b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
199c0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
199d0 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
199e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
199f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19a00 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19a10 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19a20 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19a50 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19a60 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19a70 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19a80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19aa0 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19ab0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19ac0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19ad0 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19ae0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19af0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19b00 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19b10 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19b20 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19b30 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19b50 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19b70 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19b80 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19b90 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19bb0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19bd0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19be0 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19bf0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19c00 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19c10 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19c20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19c30 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19c40 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19c50 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19c60 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19c70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19c80 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19c90 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19ca0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19cb0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19cc0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19cd0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19ce0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19cf0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19d00 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19d10 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19d20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19d30 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19d40 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19d60 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19d70 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19d80 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19d90 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19da0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19db0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19dc0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19dd0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19de0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19df0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19e00 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19e10 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19e20 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
19e30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
19e40 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
19e50 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
19e60 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
19e70 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
19e80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
19e90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19ea0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
19eb0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
19ec0 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
19ed0 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
19ee0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19ef0 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
19f00 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
19f10 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
19f20 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
19f30 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
19f40 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
19f50 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
19f60 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
19f70 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
19f80 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
19f90 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
19fa0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
19fb0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
19fc0 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
19fd0 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
19fe0 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
19ff0 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a000 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a010 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a020 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a030 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a040 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a050 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a060 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a080 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a090 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a0a0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a0b0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a0c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a0d0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a0e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a0f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a100 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a110 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a130 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a140 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a150 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a160 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a170 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a180 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a190 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a1a0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a1b0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a1c0 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a1d0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a1e0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a1f0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a200 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a210 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a220 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a230 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a240 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a250 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a260 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a270 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a290 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a2a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a2b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a2c0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a2d0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2f0 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a300 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a310 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a320 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a340 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a350 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a360 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a370 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a380 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a390 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a3a0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a3b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a3c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a3d0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a3e0 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a3f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a400 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a410 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a420 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a430 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a440 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a460 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a470 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a480 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a490 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a4a0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a4b0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a4c0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a4d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a4e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4f0 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a500 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a510 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a520 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a530 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a540 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a550 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a560 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a570 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a580 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a590 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a5a0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a5b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a5c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a5d0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a5e0 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a5f0 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a600 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a610 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a620 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a630 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a640 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a650 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a660 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a680 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a690 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a6a0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a6b0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a6c0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a6d0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a6e0 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a6f0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a700 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a710 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a720 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a730 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a740 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a750 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a760 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a770 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a780 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a790 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a7a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a7b0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a7c0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a7d0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1a7e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1a7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a800 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1a810 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1a820 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1a830 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1a840 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1a850 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1a860 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a870 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a880 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a890 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a8a0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a8b0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a8c0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a8d0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a8e0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a8f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a900 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a910 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a920 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a930 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a940 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a950 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a960 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a970 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a980 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a990 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a9a0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a9b0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a9c0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a9d0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a9e0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a9f0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1aa00 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1aa10 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1aa20 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1aa30 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1aa40 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1aa50 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1aa60 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1aa70 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1aa80 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1aa90 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1aaa0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1aab0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1aac0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1aad0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1aae0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ab00 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1ab10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ab20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1ab30 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ab40 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ab50 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ab60 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ab70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ab80 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1ab90 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1aba0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1abb0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1abc0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1abd0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1abe0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1abf0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1ac00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1ac10 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1ac20 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1ac30 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1ac40 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1ac50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ac60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1ac70 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1ac80 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1ac90 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1aca0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1acb0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1acc0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1acd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1ace0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1acf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1ad00 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1ad10 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1ad20 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1ad30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1ad40 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1ad50 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1ad60 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1ad70 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1ad80 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1ad90 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1ada0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1adb0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1adc0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1add0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1ade0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1adf0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1ae00 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1ae10 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1ae20 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ae30 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1ae40 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1ae50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ae60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ae70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1ae80 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1ae90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aea0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1aec0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1aed0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1aee0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aef0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1af00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1af10 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1af20 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1af30 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1af40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1af60 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1af70 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1af80 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1af90 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1afa0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1afb0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1afc0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1afd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1afe0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1aff0 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b000 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b010 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b020 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b030 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b040 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a  ge rollback */..
1b050 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1b060 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1b070 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1b080 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1b090 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1b0a0 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1b0b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1b0c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1b0d0 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1b0e0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1b0f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1b100 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1b120 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b130 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1b140 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1b150 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1b160 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1b170 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1b180 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1b190 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1b1a0 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1b1b0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1b1c0 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1b1d0 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1b1e0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1b1f0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1b200 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1b210 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1b220 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1b230 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1b240 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1b250 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1b260 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1b270 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1b280 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1b290 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1b2a0 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1b2b0 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1b2c0 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1b2d0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1b2e0 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1b2f0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1b300 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
1b310 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1b320 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1b330 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1b340 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1b350 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1b360 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1b370 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1b380 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1b390 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1b3a0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1b3b0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1b3c0 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1b3d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b3e0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1b3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b400 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1b410 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1b420 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1b430 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1b440 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1b450 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1b460 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1b470 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1b480 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b490 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1b4a0 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1b4b0 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1b4c0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1b4d0 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1b4e0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1b4f0 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1b500 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1b510 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1b520 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1b530 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1b540 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1b550 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1b560 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1b570 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1b580 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1b590 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1b5a0 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1b5b0 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1b5c0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b5d0 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1b5e0 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1b5f0 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1b600 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1b610 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1b620 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1b630 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1b640 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1b650 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1b660 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b670 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1b680 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1b690 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1b6a0 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1b6b0 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1b6c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1b6d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1b6e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1b6f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b700 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1b710 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b720 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1b730 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b740 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1b750 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1b760 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1b770 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1b780 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1b790 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1b7a0 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1b7b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1b7c0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1b7d0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1b7e0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1b7f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1b800 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1b810 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1b820 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1b830 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1b840 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1b850 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1b860 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1b870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1b880 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1b890 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1b8a0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1b8b0 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1b8c0 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1b8d0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1b8e0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1b8f0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1b900 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1b910 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1b920 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1b930 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1b940 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1b950 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1b960 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1b970 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1b980 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1b990 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1b9a0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1b9b0 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1b9c0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1b9d0 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1b9e0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1b9f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1ba00 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1ba10 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1ba20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1ba30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ba40 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1ba50 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1ba60 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1ba70 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1ba80 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1ba90 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1baa0 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1bab0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bac0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1bad0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1bae0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1baf0 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1bb00 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1bb10 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1bb20 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1bb30 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1bb40 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1bb50 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1bb60 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1bb70 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1bb80 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1bb90 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1bba0 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1bbb0 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1bbc0 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1bbd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1bbe0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1bbf0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1bc00 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1bc10 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1bc20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1bc30 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1bc40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bc50 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1bc60 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1bc70 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1bc80 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1bc90 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1bca0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1bcb0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1bcc0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1bcd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bce0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1bcf0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1bd00 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bd10 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1bd20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1bd30 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1bd40 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1bd50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1bd60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bd70 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1bd80 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1bd90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1bda0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1bdb0 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1bdc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bdd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1bde0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1bdf0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1be00 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1be10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1be20 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1be30 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1be40 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1be50 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1be60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1be70 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1be80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1be90 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1bea0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1beb0 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1bec0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1bed0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1bee0 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1bef0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1bf00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1bf10 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1bf20 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1bf30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1bf40 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1bf50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bf60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1bf70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1bf80 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1bf90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1bfa0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1bfb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1bfc0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1bfd0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1bfe0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1bff0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1c000 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1c010 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1c020 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1c030 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c040 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1c050 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1c060 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1c070 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1c080 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1c090 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1c0a0 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1c0b0 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1c0c0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1c0d0 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1c0e0 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1c0f0 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1c100 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1c110 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1c120 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1c130 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1c140 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1c150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c170 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c180 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1c190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c1a0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1c1b0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1c1c0 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1c1d0 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1c1e0 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1c1f0 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1c200 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1c210 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1c220 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1c230 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1c240 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1c250 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1c260 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1c270 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1c280 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1c290 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1c2a0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1c2b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1c2c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c2d0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c2e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c2f0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1c300 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1c310 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1c320 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  back:.  /* Follo
1c330 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1c340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c350 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1c360 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1c370 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1c380 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1c390 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1c3a0 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1c3b0 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1c3c0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1c3d0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1c3e0 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1c3f0 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1c400 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1c410 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1c420 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1c430 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1c440 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c450 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1c460 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
1c470 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
1c480 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  t(pPager->fd,SQL
1c490 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1c4a0 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23  HANGED,0);.  }.#
1c4b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1c4c0 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1c4d0 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1c4e0 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1c4f0 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1c500 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1c510 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1c520 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1c530 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1c540 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1c550 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1c560 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1c570 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1c580 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1c590 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1c5a0 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1c5b0 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1c5c0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1c5d0 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1c5e0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1c5f0 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1c600 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1c610 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1c620 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1c630 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1c640 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1c650 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1c660 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1c670 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1c680 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1c690 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1c6a0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1c6b0 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1c6c0 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1c6d0 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1c6e0 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1c6f0 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1c700 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1c710 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c720 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1c730 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1c740 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c750 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1c760 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1c770 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1c780 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1c790 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1c7a0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c7b0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1c7c0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1c7d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1c7e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c7f0 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  K.   && (pPager-
1c800 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1c810 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1c820 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1c830 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1c840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c850 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72  PagerSync(pPager
1c860 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c880 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1c890 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1c8a0 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
1c8b0 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74  ='\0', 0);.    t
1c8c0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1c8d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1c8e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c8f0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1c900 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
1c910 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
1c920 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
1c930 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
1c940 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
1c950 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
1c960 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
1c970 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
1c980 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
1c990 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1c9a0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
1c9b0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1c9c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c9d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1c9e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1c9f0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1ca00 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1ca10 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1ca20 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1ca30 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1ca40 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1ca50 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1ca60 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1ca70 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1ca80 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1ca90 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1caa0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1cab0 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1cac0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1cad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1cae0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1caf0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1cb00 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1cb10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
1cb20 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1cb30 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1cb40 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1cb50 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1cb60 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1cb70 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1cb80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1cb90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1cba0 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1cbb0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1cbc0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1cbd0 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1cbe0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1cbf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cc00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1cc10 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1cc20 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1cc30 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1cc40 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1cc50 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1cc60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1cc70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1cc80 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1cc90 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61  r *pPg, u32 iFra
1cca0 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  me){.  Pager *pP
1ccb0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1ccc0 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1ccd0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1cce0 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1ccf0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1cd00 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1cd10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1cd20 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1cd30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1cd40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1cd50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1cd60 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70  pgsz = pPager->p
1cd70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62  ageSize; /* Numb
1cd80 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
1cd90 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
1cda0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1cdb0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1cdc0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1cdd0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1cde0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
1cdf0 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
1ce00 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
1ce10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ce20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1ce30 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
1ce40 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
1ce50 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1ce60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ce70 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  OK;.  }..  if( i
1ce80 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
1ce90 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1cea0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1ceb0 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1cec0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1ced0 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1cee0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1cef0 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e  ame, pgsz, pPg->
1cf00 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b  pData);.  }else{
1cf10 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1cf20 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1cf30 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1cf40 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1cf50 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1cf60 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1cf70 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1cf80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cf90 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1cfa0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1cfb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cfc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1cfd0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1cfe0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1cff0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d000 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d010 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d020 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d030 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d040 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d050 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d060 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d070 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d080 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d090 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d0a0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d0b0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d0c0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d0d0 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d0e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d0f0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d100 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d110 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d120 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d130 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d140 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d150 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d160 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d170 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d180 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d190 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d1a0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d1b0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d1c0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d1d0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d1e0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d1f0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1d200 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1d210 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1d220 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1d230 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1d240 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
1d250 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1d260 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1d270 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1d280 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1d290 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1d2a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1d2b0 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1d2c0 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1d2d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d2e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1d2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1d300 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1d310 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1d320 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1d330 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1d340 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1d350 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1d360 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1d370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1d380 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1d390 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1d3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1d3b0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
1d3c0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1d3d0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1d3e0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1d3f0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1d400 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1d410 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1d420 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
1d430 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
1d440 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1d450 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1d460 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1d470 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1d480 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1d490 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1d4a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1d4b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1d4c0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d4d0 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1d4e0 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1d4f0 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1d500 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1d510 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1d520 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1d530 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1d540 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1d550 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1d560 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1d570 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1d580 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1d590 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d5a0 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1d5b0 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1d5c0 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1d5d0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1d5e0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1d5f0 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1d600 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1d610 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1d620 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1d630 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1d640 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1d650 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1d660 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1d670 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1d680 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1d690 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1d6a0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1d6b0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1d6c0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1d6d0 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1d6e0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1d6f0 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1d700 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1d710 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1d720 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1d730 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1d740 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1d750 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1d760 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1d770 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1d780 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1d790 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1d7a0 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1d7b0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d7c0 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1d7d0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1d7e0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d7f0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d800 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1d810 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1d820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d830 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1d840 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1d850 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1d860 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1d870 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d880 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1d890 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1d8a0 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1d8b0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d8c0 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1d8d0 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1d8e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1d8f0 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1d900 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1d910 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1d920 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1d930 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1d940 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1d950 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1d960 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1d970 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1d980 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1d990 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1d9a0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1d9b0 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1d9c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1d9d0 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1d9e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1d9f0 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1da00 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1da10 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1da20 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1da30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1da40 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1da50 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1da60 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1da70 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1da80 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1da90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1daa0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1dab0 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1dac0 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1dad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1dae0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1daf0 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1db00 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
1db10 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1db20 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1db30 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
1db40 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
1db50 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
1db60 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1db70 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
1db80 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
1db90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1dba0 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
1dbb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dbc0 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a  u32 iFrame = 0;.
1dbd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dbe0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
1dbf0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67  Pager->pWal, pPg
1dc00 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  ->pgno, &iFrame)
1dc10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1dc20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dc30 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1dc40 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65  Page(pPg, iFrame
1dc50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dc60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dc70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1dc80 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1dc90 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
1dca0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1dcb0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1dcc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1dcd0 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1dce0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1dcf0 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1dd00 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1dd10 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1dd20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1dd30 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1dd40 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1dd50 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1dd60 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1dd70 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1dd80 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1dd90 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1dda0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1ddb0 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1ddc0 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1ddd0 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1dde0 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1ddf0 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1de00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1de10 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1de20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1de30 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1de40 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1de50 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1de60 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1de70 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1de80 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1de90 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1dea0 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1deb0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1dec0 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1ded0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dee0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1def0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1df00 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1df10 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1df20 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1df30 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1df40 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1df50 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1df80 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1df90 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1dfb0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1dfc0 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1dfd0 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1dfe0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1dff0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1e000 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1e010 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1e020 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1e030 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1e040 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1e050 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1e060 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1e070 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1e080 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1e090 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1e0a0 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1e0b0 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1e0c0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1e0d0 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1e0e0 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1e0f0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1e100 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1e110 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1e120 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1e130 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1e140 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1e150 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1e160 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e170 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1e180 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1e190 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
1e1a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1e1b0 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1e1c0 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1e1d0 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1e1e0 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1e1f0 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1e200 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1e210 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1e220 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1e230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1e240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e250 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1e260 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1e270 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1e280 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1e290 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1e2a0 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1e2b0 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1e2c0 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1e2d0 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1e2e0 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1e2f0 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1e300 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1e310 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1e320 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  changed. .**.** 
1e330 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  The list of page
1e340 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  s passed into th
1e350 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1e360 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70  ways sorted by p
1e370 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48  age number..** H
1e380 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20  ence, if page 1 
1e390 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65  appears anywhere
1e3a0 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74   on the list, it
1e3b0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72   will be the fir
1e3c0 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61  st page..*/ .sta
1e3d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1e3e0 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1e3f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1e400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1e410 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1e420 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e440 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1e450 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1e460 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e480 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1e490 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1e4a0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1e4b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1e4c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e4d0 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1e4e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e510 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1e520 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20   nList;         
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e540 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e550 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20  in pList */.#if 
1e560 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1e570 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1e580 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41  (SQLITE_CHECK_PA
1e590 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b  GES).  PgHdr *p;
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1e5c0 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1e5d0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
1e5e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
1e5f0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1e600 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20  pList );.#ifdef 
1e610 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1e620 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1e630 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69  e page list is i
1e640 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
1e650 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69  r */.  for(p=pLi
1e660 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72  st; p && p->pDir
1e670 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  ty; p=p->pDirty)
1e680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1e690 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74  >pgno < p->pDirt
1e6a0 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23  y->pgno );.  }.#
1e6b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1e6c0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
1e6d0 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b  0 || isCommit );
1e6e0 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20  .  if( isCommit 
1e6f0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57  ){.    /* If a W
1e700 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e710 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
1e720 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  d, there is no p
1e730 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a  oint in writing.
1e740 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73      ** any pages
1e750 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1e760 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rs greater than 
1e770 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74  nTruncate into t
1e780 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20  he WAL file..   
1e790 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65   ** They will ne
1e7a0 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61  ver be read by a
1e7b0 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65  ny client. So re
1e7c0 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
1e7d0 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a  he pDirty.    **
1e7e0 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20   list here. */. 
1e7f0 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1e800 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1e810 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1e820 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1e830 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1e840 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1e850 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1e860 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1e870 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1e880 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1e890 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1e8a0 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1e8b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e8c0 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1e8d0 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1e8e0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1e8f0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1e900 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1e910 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1e920 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e930 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e940 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e950 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e960 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e970 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e980 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e990 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e9a0 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e9b0 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e9c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e9d0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e9e0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e9f0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1ea00 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1ea10 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1ea20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1ea30 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1ea40 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1ea50 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1ea60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1ea70 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1ea80 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1ea90 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1eaa0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1eab0 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1eac0 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1ead0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1eae0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1eaf0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1eb00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1eb10 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1eb20 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1eb30 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1eb40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1eb50 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1eb60 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1eb70 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1eb80 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1eb90 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1eba0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ebb0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1ebc0 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1ebd0 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1ebe0 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1ebf0 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1ec00 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1ec10 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1ec20 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1ec30 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1ec40 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1ec50 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1ec60 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1ec70 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1ec80 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ecb0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1ecc0 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1ecd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ece0 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1ecf0 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1ed00 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1ed10 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1ed20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1ed30 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1ed40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1ed50 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1ed60 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1ed70 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1ed80 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1ed90 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1eda0 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1edb0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1edc0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1edd0 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1ede0 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1edf0 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1ee00 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1ee10 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1ee20 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1ee30 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1ee40 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1ee50 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1ee60 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1ee70 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1ee80 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1ee90 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1eea0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1eeb0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1eec0 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1eed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1eee0 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1eef0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1ef00 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45  er);.    if( USE
1ef10 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
1ef20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
1ef30 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
1ef40 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
1ef50 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
1ef60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ef70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
1ef80 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61   part of the tra
1ef90 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47  nsition from PAG
1efa0 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41  ER_OPEN.** to PA
1efb0 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
1efc0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1efd0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1efe0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
1eff0 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e  n pages (assumin
1f000 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
1f010 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1f020 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69   in Pager.pageSi
1f030 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ze)..**.** If no
1f040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
1f050 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1f060 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a  rned and the siz
1f070 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f080 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73  e.** in pages is
1f090 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61   stored in *pnPa
1f0a0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ge. Otherwise, a
1f0b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65  n error code (pe
1f0c0 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  rhaps.** SQLITE_
1f0d0 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20  IOERR_FSTAT) is 
1f0e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e  returned and *pn
1f0f0 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d  Page is left unm
1f100 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
1f110 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
1f120 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1f130 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67  ger, Pgno *pnPag
1f140 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
1f150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f160 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1f170 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
1f180 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75  Page */..  /* Qu
1f190 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d  ery the WAL sub-
1f1a0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64  system for the d
1f1b0 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68  atabase size. Th
1f1c0 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20  e WalDbsize().  
1f1d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
1f1e0 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20  rns zero if the 
1f1f0 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  WAL is not open 
1f200 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c  (i.e. Pager.pWal
1f210 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66  ==0), or.  ** if
1f220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f230 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ze is not availa
1f240 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73  ble. The databas
1f250 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20  e size is not.  
1f260 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ** available fro
1f270 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f280 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20  stem if the log 
1f290 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72  file is empty or
1f2a0 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e  .  ** contains n
1f2b0 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65  o valid committe
1f2c0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
1f2d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1f2e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f2f0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1f300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f310 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1f320 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  K );.  nPage = s
1f330 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
1f340 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1f350 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1f360 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f  base size was no
1f370 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1f380 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1f390 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d  tem,.  ** determ
1f3a0 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20  ine it based on 
1f3b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1f3d0 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20  f the size.  ** 
1f3e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f3f0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69  file is not an i
1f400 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
1f410 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
1f420 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77  ,.  ** round dow
1f430 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74  n to the nearest
1f440 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61   page. Except, a
1f450 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74  ny file larger t
1f460 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73  han 0.  ** bytes
1f470 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
1f480 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69  idered to contai
1f490 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  n at least one p
1f4a0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1f4b0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1f4c0 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4e0 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
1f4f0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1f500 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1f510 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1f520 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1f530 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
1f540 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1f550 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1f560 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1f570 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
1f580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f5b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f5c0 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1f5d0 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
1f5e0 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
1f5f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1f600 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
1f610 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
1f620 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1f630 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
1f640 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
1f650 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
1f660 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
1f670 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
1f680 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
1f690 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
1f6a0 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
1f6b0 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
1f6c0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1f6d0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1f6e0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
1f6f0 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
1f700 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
1f710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1f720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f730 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
1f740 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
1f750 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
1f760 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
1f770 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1f780 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
1f790 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f7a0 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
1f7b0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1f7c0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
1f7d0 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
1f7e0 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
1f7f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f800 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
1f810 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1f820 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
1f830 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
1f840 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
1f850 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
1f860 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
1f870 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
1f880 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
1f890 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
1f8a0 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
1f8b0 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
1f8c0 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
1f8d0 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
1f8e0 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
1f8f0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
1f900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1f910 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
1f920 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
1f930 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
1f940 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
1f950 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f960 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
1f970 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
1f980 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
1f990 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1f9a0 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
1f9b0 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
1f9c0 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
1f9d0 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
1f9e0 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
1f9f0 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
1fa00 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
1fa10 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
1fa20 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
1fa30 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
1fa40 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
1fa50 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
1fa60 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
1fa70 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
1fa80 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
1fa90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1faa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fab0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1fac0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1fad0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1fae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1faf0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1fb00 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
1fb10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1fb20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
1fb50 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
1fb60 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1fb90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1fba0 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
1fbb0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1fbc0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1fbd0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fbe0 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1fbf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1fc00 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1fc10 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1fc20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1fc30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1fc40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
1fc50 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d  ETE_NOENT ) rc =
1fc60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1fc70 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
1fc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1fc90 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1fca0 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
1fcb0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1fcc0 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
1fcd0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1fce0 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
1fcf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1fd00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fd10 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
1fd20 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1fd30 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
1fd40 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
1fd50 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
1fd60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1fd70 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1fd80 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
1fd90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1fda0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1fdb0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1fdc0 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
1fdd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1fde0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
1fdf0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
1fe00 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
1fe10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1fe20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1fe30 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
1fe40 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
1fe50 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
1fe60 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
1fe70 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
1fe80 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1fe90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1fea0 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
1feb0 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
1fec0 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
1fed0 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
1fee0 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
1fef0 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
1ff00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1ff10 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
1ff20 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
1ff30 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
1ff40 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
1ff50 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1ff60 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
1ff70 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
1ff80 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
1ff90 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
1ffa0 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
1ffb0 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
1ffc0 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
1ffd0 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
1ffe0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
1fff0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
20000 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20010 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
20020 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
20030 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20040 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20050 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
20060 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20070 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
20080 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20090 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
200a0 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
200b0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
200c0 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
200d0 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
200e0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
200f0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
20100 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
20110 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
20120 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
20130 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
20140 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
20150 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
20160 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20170 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
20180 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
201a0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
201b0 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
201c0 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
201d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
201e0 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
201f0 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
20200 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
20210 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20220 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
20230 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
20240 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
20250 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
20260 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
20270 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
20280 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
20290 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
202a0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
202b0 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
202c0 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
202d0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
202e0 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
202f0 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
20300 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
20310 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
20320 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
20330 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
20340 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
20350 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
20360 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
20370 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
20380 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
20390 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
203a0 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
203b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
203c0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
203d0 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
203e0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
203f0 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
20400 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
20410 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
20420 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
20430 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
20440 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
20450 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
20460 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
20470 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
20480 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
20490 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
204a0 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
204b0 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
204c0 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
204d0 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
204e0 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
204f0 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
20500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20510 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
20520 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
20530 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
20540 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
20550 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
20560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
20570 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
20580 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20590 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
205a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
205b0 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
205c0 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
205d0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
205e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
205f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
20600 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
20610 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
20620 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
20630 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
20640 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
20650 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
20660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20670 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
20680 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
20690 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
206a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
206b0 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
206c0 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
206d0 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
206e0 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
206f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
20700 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
20710 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
20720 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
20730 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
20740 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
20750 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
20760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20770 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
20780 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
20790 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
207a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
207b0 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
207c0 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
207d0 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
207e0 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
207f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20800 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
20810 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20820 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
20830 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
20840 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
20850 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
20860 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
20870 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
20880 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
208a0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
208b0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
208c0 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
208d0 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
208e0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
208f0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
20900 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
20910 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
20920 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
20930 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
20940 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
20950 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
20960 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
20970 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
20980 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
20990 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
209a0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
209b0 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
209c0 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
209d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
209e0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
209f0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
20a00 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
20a10 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
20a20 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
20a30 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20a40 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20a50 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
20a60 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20a70 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20a80 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
20a90 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
20aa0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
20ab0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
20ac0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
20ad0 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
20ae0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
20af0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
20b00 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
20b10 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
20b20 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
20b30 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
20b40 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
20b50 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
20b60 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
20b70 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
20b80 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
20b90 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
20ba0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20bb0 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
20bc0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20bd0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
20be0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20bf0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
20c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20c10 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20c20 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
20c30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
20c40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20c50 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
20c60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20c70 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
20c80 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
20c90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20ca0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
20cb0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20cc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20cd0 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
20ce0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20cf0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
20d00 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
20d10 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20d20 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
20d30 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
20d40 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
20d50 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
20d60 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
20d70 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
20d80 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
20d90 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
20da0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
20db0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
20dc0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
20dd0 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
20de0 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
20df0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
20e00 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
20e10 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20e20 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
20e30 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
20e40 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
20e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20e60 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20e70 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
20e80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20e90 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
20ea0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
20eb0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
20ec0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
20ed0 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
20ee0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
20ef0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20f00 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
20f10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
20f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20f30 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
20f40 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
20f50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
20f60 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
20f70 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
20f80 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
20f90 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
20fa0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
20fb0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
20fc0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20fd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
20fe0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
20ff0 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
21000 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21010 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21020 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21030 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
21040 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
21050 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
21060 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21070 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
21080 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
21090 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
210a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
210b0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
210c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
210d0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
210e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
210f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21100 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21110 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
21120 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
21130 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21140 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21150 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21160 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
21170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
21180 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
21190 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
211a0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
211b0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
211c0 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
211d0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
211e0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
211f0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21200 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
21210 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
21220 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
21230 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
21240 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
21250 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
21260 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21270 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21280 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21290 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
212a0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
212b0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
212c0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
212d0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
212e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
212f0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
21300 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
21310 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
21320 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
21330 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
21340 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21350 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
21360 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
21370 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
21380 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
21390 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
213a0 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
213b0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
213c0 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
213d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
213e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
213f0 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
21400 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
21410 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21420 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21430 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
21440 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
21450 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
21470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21480 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
21490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
214a0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
214b0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
214c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
214d0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
214e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
214f0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
21500 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
21510 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
21520 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
21530 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
21540 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
21550 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
21560 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
21570 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 20 62 61 73  L_MMAP_LIMIT bas
21580 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
21590 74 20 76 61 6c 75 65 20 6f 66 20 6d 78 4d 6d 61  t value of mxMma
215a0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
215b0 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
215c0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
215d0 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
215e0 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4d  SQLITE_DISABLE_M
215f0 4d 41 50 29 0a 20 20 73 71 6c 69 74 65 33 5f 66  MAP).  sqlite3_f
21600 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
21610 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70  ->fd;.  if( isOp
21620 65 6e 28 66 64 29 20 29 7b 0a 20 20 20 20 73 71  en(fd) ){.    sq
21630 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 3b 0a  lite3_int64 mx;.
21640 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65      pPager->bUse
21650 46 65 74 63 68 20 3d 20 28 66 64 2d 3e 70 4d 65  Fetch = (fd->pMe
21660 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
21670 3d 33 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6d  =3) && pPager->m
21680 78 4d 6d 61 70 3e 30 3b 0a 20 20 20 20 6d 78 20  xMmap>0;.    mx 
21690 3d 20 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70  = pPager->mxMmap
216a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
216b0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
216c0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
216d0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
216e0 49 54 2c 20 26 6d 78 29 3b 0a 20 20 7d 0a 23 65  IT, &mx);.  }.#e
216f0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
21700 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21710 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
21720 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
21730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21740 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
21750 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
21760 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
21770 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
21780 6e 74 36 34 20 6d 78 4d 6d 61 70 29 7b 0a 20 20  nt64 mxMmap){.  
21790 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70 20 3d  pPager->mxMmap =
217a0 20 6d 78 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   mxMmap;.  pager
217b0 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
217c0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
217d0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
217e0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
217f0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
21800 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21810 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
21820 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
21830 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
21840 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
21860 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
21870 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21880 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
21890 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
218a0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
218b0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
218c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
218d0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
218e0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
218f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
21900 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
21910 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
21920 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
21930 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
21940 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
21950 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
21960 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
21970 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
21980 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
21990 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
219a0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
219b0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
219c0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
219d0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
219e0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
219f0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
21a00 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
21a10 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
21a30 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
21a40 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
21a50 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21a60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21a70 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
21a80 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
21a90 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
21aa0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
21ab0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
21ac0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
21ad0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
21ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21b00 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
21b10 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
21b20 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
21b30 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
21b40 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
21b50 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21b60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21b70 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
21b80 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
21b90 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
21ba0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
21bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
21bd0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
21be0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
21bf0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
21c00 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
21c10 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
21c20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
21c30 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
21c40 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
21c50 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21c60 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
21c70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21c80 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
21c90 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
21ca0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
21cb0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
21cc0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
21cd0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
21ce0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21cf0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
21d00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
21d10 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
21d20 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21d30 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21d40 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21d50 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21d60 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21d70 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21d80 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21d90 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
21da0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
21db0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
21dc0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
21dd0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
21de0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
21df0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
21e00 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
21e10 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
21e20 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21e30 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21e40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21e50 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21e60 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21e70 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21e80 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21e90 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
21ea0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
21eb0 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
21ec0 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
21ed0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
21ee0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
21ef0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
21f00 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
21f10 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
21f20 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21f30 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21f40 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21f50 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21f60 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21f70 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21f80 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21f90 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
21fa0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
21fb0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
21fc0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
21fd0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
21fe0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
21ff0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
22000 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
22010 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
22020 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22030 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
22040 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
22050 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
22060 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
22070 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
22080 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
22090 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
220a0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
220b0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
220c0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
220d0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
220e0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
220f0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
22100 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
22110 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22120 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
22130 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
22140 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
22150 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
22160 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
22170 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
22180 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
22190 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
221a0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
221b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
221c0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
221d0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
221e0 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
221f0 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
22200 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
22210 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
22220 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
22230 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
22240 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
22250 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
22260 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
22270 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
22280 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
22290 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
222a0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
222b0 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
222c0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
222d0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
222e0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
222f0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
22300 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
22310 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
22320 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
22330 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
22340 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22350 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
22360 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22370 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
22380 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
22390 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
223a0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
223b0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
223c0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
223d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
223e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
223f0 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
22400 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
22410 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22420 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22430 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
22440 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22450 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22460 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
22470 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22480 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22490 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
224a0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
224b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
224c0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
224d0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
224e0 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
224f0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
22500 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
22510 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22520 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
22530 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
22540 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TIONS;.  }.}.#en
22550 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
22560 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
22570 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
22580 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
22590 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
225a0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
225b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
225c0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
225d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
225e0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
225f0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
22600 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
22610 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
22620 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
22630 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
22640 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
22650 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
22660 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22670 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
22680 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
22690 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
226a0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
226b0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
226c0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
226d0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
226e0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
226f0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
22700 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
22710 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
22720 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
22730 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
22740 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
22750 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
22760 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
22770 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
22780 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
22790 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
227a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
227b0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
227c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
227d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
227e0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
227f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
22800 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
22810 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
22820 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
22830 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22840 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
22850 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
22860 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
22870 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
22880 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
22890 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
228a0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
228b0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
228c0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
228d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
228f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22900 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22910 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
22920 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
22930 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
22940 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22950 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
22960 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
22970 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22980 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
22990 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
229a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
229b0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
229c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
229d0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
229e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
229f0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
22a00 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
22a10 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
22a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22a30 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
22a40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
22a60 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
22a70 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
22a80 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
22a90 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
22aa0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
22ab0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
22ac0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
22ad0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
22ae0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
22af0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
22b00 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
22b10 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22b20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
22b30 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
22b40 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
22b50 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
22b60 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
22b70 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
22b80 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
22b90 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
22ba0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
22bb0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
22bc0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
22bd0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
22be0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
22bf0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
22c00 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
22c10 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
22c30 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
22c40 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
22c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c80 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
22c90 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
22ca0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
22cb0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
22cc0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
22cd0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
22ce0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
22cf0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
22d00 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
22d10 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
22d20 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
22d30 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
22d40 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
22d50 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
22d60 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
22d70 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
22d80 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
22d90 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
22da0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
22db0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
22dc0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
22dd0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
22de0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
22df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22e00 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
22e10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
22e40 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
22e50 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
22e60 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
22e70 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
22e80 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
22e90 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
22ea0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22ec0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
22ed0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
22ee0 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  */.){.  pPager->
22ef0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
22f00 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
22f10 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
22f20 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
22f30 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28  ndlerArg;..  if(
22f40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
22f50 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
22f60 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29  **ap = (void **)
22f70 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61  &pPager->xBusyHa
22f80 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72  ndler;.    asser
22f90 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
22fa0 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
22fb0 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
22fc0 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
22fd0 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
22fe0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
22ff0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
23000 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
23010 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
23020 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
23030 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
23040 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
23050 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
23060 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23070 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
23080 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
23090 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
230a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
230b0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
230c0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
230d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
230e0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
230f0 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
23100 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
23110 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
23120 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
23130 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
23140 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
23150 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
23160 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
23170 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
23180 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
23190 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
231a0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
231b0 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
231c0 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
231d0 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
231e0 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
231f0 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
23200 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
23210 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
23220 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
23230 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
23240 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
23250 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
23260 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
23270 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
23280 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
23290 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
232a0 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
232b0 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
232c0 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
232d0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
232e0 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
232f0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
23300 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
23310 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
23320 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
23330 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23340 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
23350 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
23360 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
23370 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
23380 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
23390 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
233a0 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
233b0 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
233c0 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
233d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
233e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
233f0 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
23400 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
23410 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
23420 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
23430 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
23440 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23450 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
23460 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
23470 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
23480 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
23490 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
234a0 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
234b0 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
234c0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
234d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
234e0 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
234f0 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
23500 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23510 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
23520 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
23530 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
23540 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
23550 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
23560 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23570 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
23580 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
23590 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
235a0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
235b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
235c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
235d0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
235e0 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
235f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
23600 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
23610 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
23620 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
23630 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
23640 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
23650 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
23660 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
23670 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
23680 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
23690 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
236a0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
236b0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
236c0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
236d0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
236e0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
236f0 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
23700 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
23710 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
23720 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
23730 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
23740 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
23750 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
23760 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
23770 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
23780 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
23790 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
237a0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
237b0 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
237c0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
237d0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
237e0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
237f0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
23800 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
23810 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
23820 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
23830 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
23840 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23850 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
23860 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
23870 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
23880 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
23890 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
238a0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
238b0 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
238c0 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
238d0 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
238e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
238f0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
23900 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23910 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
23920 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
23930 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
23940 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
23950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
23970 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
23980 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
23990 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
239a0 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
239b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
239c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
239d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
239e0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
239f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
23a00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
23a10 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
23a20 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
23a30 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
23a40 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
23a50 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  eSize;.      sql
23a60 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
23a70 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
23a80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23a90 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
23aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
23ab0 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
23ac0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
23ad0 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
23ae0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
23af0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
23b00 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
23b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23b20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
23b30 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
23b40 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
23b50 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
23b60 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
23b70 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
23b80 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
23b90 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
23ba0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
23bb0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
23bc0 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
23bd0 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
23be0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23bf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23c00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
23c10 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
23c20 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
23c30 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
23c40 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
23c50 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
23c60 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
23c70 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
23c80 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
23c90 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
23ca0 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
23cb0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
23cc0 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
23cd0 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
23ce0 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
23cf0 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
23d00 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
23d10 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
23d20 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
23d30 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
23d40 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
23d50 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
23d60 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
23d70 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
23d80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23d90 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
23da0 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
23db0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
23dc0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
23dd0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
23de0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
23df0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
23e00 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
23e10 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
23e20 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
23e30 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
23e40 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
23e50 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
23e60 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
23e70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
23e80 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
23e90 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
23ea0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
23eb0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
23ec0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
23ed0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
23ee0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
23ef0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
23f00 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
23f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
23f20 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
23f30 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
23f40 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
23f50 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
23f60 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
23f70 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
23f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23f90 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72  ->mxPgno>=pPager
23fa0 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20  ->dbSize );  /* 
23fb0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f  OP_MaxPgcnt enfo
23fc0 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72  rces this */.  r
23fd0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
23fe0 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
23ff0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
24000 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
24010 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
24020 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
24030 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
24040 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
24050 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
24060 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
24070 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
24080 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
24090 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
240a0 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
240b0 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
240c0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
240d0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
240e0 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
240f0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
24100 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
24110 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
24120 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24130 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24140 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
24150 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
24160 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
24170 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
24180 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24190 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
241a0 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
241b0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
241c0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
241d0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
241e0 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
241f0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
24200 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
24210 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
24220 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
24230 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
24240 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
24250 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24260 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
24270 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
24280 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
24290 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
242a0 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
242b0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
242c0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
242d0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
242e0 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
242f0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
24300 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
24310 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
24320 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
24330 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
24340 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
24350 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
24360 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
24370 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
24380 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
24390 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
243a0 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
243b0 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
243c0 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
243d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
243e0 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
243f0 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
24400 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
24410 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
24420 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
24430 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
24440 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
24450 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
24460 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
24470 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
24480 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
24490 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
244a0 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
244b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
244c0 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
244d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
244e0 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
244f0 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
24500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24510 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
24520 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24530 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
24540 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
24550 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24560 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
24570 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
24580 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
24590 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
245a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
245b0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
245c0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
245d0 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
245e0 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
245f0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
24600 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
24610 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
24620 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
24630 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
24640 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
24650 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
24660 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
24670 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
24680 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24690 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
246a0 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
246b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
246c0 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
246d0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
246e0 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
246f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
24700 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
24710 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
24720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24730 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24750 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
24760 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
24770 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
24780 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
24790 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
247a0 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
247b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
247c0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
247d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
247e0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
247f0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
24800 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
24810 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
24820 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
24830 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
24840 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
24850 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
24860 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
24870 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
24880 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
24890 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
248a0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
248b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
248c0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
248d0 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
248e0 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
248f0 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
24900 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
24910 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
24920 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
24930 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
24940 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
24950 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
24960 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
24970 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
24980 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
24990 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
249a0 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
249b0 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
249c0 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
249d0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
249e0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
249f0 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
24a00 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
24a10 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
24a20 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
24a30 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
24a40 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
24a50 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
24a60 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
24a70 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
24a80 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
24a90 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
24aa0 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
24ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
24ac0 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
24ad0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
24ae0 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
24af0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
24b00 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
24b10 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
24b20 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
24b30 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
24b40 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
24b50 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
24b60 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
24b70 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
24b80 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
24b90 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
24ba0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24bd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
24be0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
24bf0 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
24c00 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
24c10 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
24c20 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
24c30 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  held, or one of 
24c40 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73  the transistions
24c50 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
24c60 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
24c70 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
24c80 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
24c90 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
24ca0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
24cb0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
24cc0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
24cd0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
24ce0 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
24cf0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
24d00 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
24d10 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
24d20 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
24d30 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
24d40 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
24d50 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
24d60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
24d70 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
24d80 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
24d90 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
24da0 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
24db0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
24dc0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
24dd0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
24de0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
24df0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24e00 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
24e10 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
24e20 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
24e30 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
24e40 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
24e50 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
24e60 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
24e70 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
24e80 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
24e90 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
24ea0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
24eb0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
24ec0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
24ed0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
24ee0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
24ef0 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
24f00 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
24f10 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
24f20 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
24f30 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
24f40 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
24f50 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
24f60 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
24f70 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
24f80 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
24f90 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
24fa0 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
24fb0 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
24fc0 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
24fd0 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
24fe0 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
24ff0 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
25000 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
25010 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
25020 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
25030 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
25040 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
25050 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
25060 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
25070 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
25080 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
25090 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
250a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
250b0 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
250c0 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
250d0 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
250e0 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
250f0 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
25100 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
25110 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
25120 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
25130 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
25140 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
25150 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
25160 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
25170 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
25180 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25190 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
251a0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
251b0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
251c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
251d0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
251e0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
251f0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
25200 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
25210 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
25220 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
25230 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
25240 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
25250 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
25260 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
25270 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
25280 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
25290 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
252a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
252b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
252c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
252d0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
252e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
252f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
25300 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
25310 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
25320 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
25330 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
25340 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
25350 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25360 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
25370 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
25380 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
25390 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
253a0 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
253b0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
253c0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
253d0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
253e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
253f0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
25400 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
25410 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
25420 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
25430 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
25440 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
25450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25460 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
25470 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
25480 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
25490 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
254a0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
254b0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
254c0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
254d0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
254e0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
254f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
25500 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
25510 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
25520 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
25530 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
25540 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
25550 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
25560 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
25570 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
25580 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
25590 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
255a0 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
255b0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
255c0 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
255d0 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
255e0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
255f0 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
25600 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
25610 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
25620 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
25630 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
25640 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
25650 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
25660 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
25670 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
25680 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
25690 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
256a0 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
256b0 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
256c0 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
256d0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
256e0 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
256f0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
25700 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
25710 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
25720 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
25730 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
25740 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
25750 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
25760 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
25770 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
25780 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
25790 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
257a0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
257b0 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
257c0 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
257d0 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
257e0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
257f0 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
25800 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
25810 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
25820 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
25830 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
25840 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
25850 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
25860 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
25870 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
25880 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
25890 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
258a0 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
258b0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
258c0 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
258d0 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
258e0 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
258f0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
25900 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
25910 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
25920 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
25930 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
25940 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
25950 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
25960 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
25970 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
25980 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
25990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
259a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
259b0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
259c0 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
259d0 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
259e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
259f0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
25a00 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
25a10 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
25a20 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
25a30 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
25a40 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
25a50 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
25a60 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
25a70 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
25a80 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
25a90 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
25aa0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
25ab0 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
25ac0 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
25ad0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
25ae0 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
25af0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
25b00 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
25b10 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
25b20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
25b30 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
25b40 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25b50 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25b60 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
25b70 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25b80 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
25b90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25ba0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
25bb0 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
25bc0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
25bd0 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
25be0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
25bf0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
25c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25c10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
25c20 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
25c30 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
25c40 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
25c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25c60 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  ** Obtain a refe
25c70 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72  rence to a memor
25c80 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62  y mapped page ob
25c90 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75  ject for page nu
25ca0 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54  mber pgno. .** T
25cb0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
25cc0 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74  ll use the point
25cd0 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e  er pData, obtain
25ce0 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29  ed from xFetch()
25cf0 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
25d00 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20  ul, set *ppPage 
25d10 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
25d20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e  new page referen
25d30 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ce.** and return
25d40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
25d50 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
25d60 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25d70 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70  de and set.** *p
25d80 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a  pPage to zero..*
25d90 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65  *.** Page refere
25da0 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79  nces obtained by
25db0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
25dc0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
25dd0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20   released.** by 
25de0 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c  calling pagerRel
25df0 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  easeMapPage()..*
25e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
25e10 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
25e20 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
25e30 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
25e40 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
25e50 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ect */.  Pgno pg
25e60 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
25e70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
25e80 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69   number */.  voi
25e90 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  d *pData,       
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25eb0 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20  xFetch()'d data 
25ec0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
25ed0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67  .  PgHdr **ppPag
25ee0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
25ef0 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69     /* OUT: Acqui
25f00 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  red page object 
25f10 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
25f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f30 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
25f40 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f  y mapped page to
25f50 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66   return */..  if
25f60 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  ( pPager->pMmapF
25f70 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a  reelist ){.    *
25f80 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61  ppPage = p = pPa
25f90 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
25fa0 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
25fb0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
25fc0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
25fd0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
25fe0 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74    memset(p->pExt
25ff0 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  ra, 0, pPager->n
26000 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b  Extra);.  }else{
26010 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26020 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
26030 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
26040 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
26050 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
26060 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
26070 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
26080 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
26090 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
260a0 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
260b0 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
260c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
260d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
260e0 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f   p->pExtra = (vo
260f0 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  id *)&p[1];.    
26100 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52  p->flags = PGHDR
26110 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52  _MMAP;.    p->nR
26120 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70  ef = 1;.    p->p
26130 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
26140 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
26150 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20  ->pExtra==(void 
26160 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73  *)&p[1] );.  ass
26170 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30  ert( p->pPage==0
26180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26190 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d  >flags==PGHDR_MM
261a0 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AP );.  assert( 
261b0 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  p->pPager==pPage
261c0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
261d0 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20  ->nRef==1 );..  
261e0 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  p->pgno = pgno;.
261f0 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61    p->pData = pDa
26200 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ta;.  pPager->nM
26210 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74  mapOut++;..  ret
26220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26230 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
26240 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
26250 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73  age pPg. pPg mus
26260 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75  t have been retu
26270 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65  rned by an .** e
26280 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70  arlier call to p
26290 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
262a0 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
262b0 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73  void pagerReleas
262c0 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a  eMapPage(PgHdr *
262d0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
262e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
262f0 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ger;.  pPager->n
26300 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67  MmapOut--;.  pPg
26310 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
26320 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26330 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  ;.  pPager->pMma
26340 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b  pFreelist = pPg;
26350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26360 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
26370 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b  ->iVersion>=3 );
26380 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65  .  sqlite3OsUnfe
26390 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
263a0 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
263b0 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
263c0 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  ize, pPg->pData)
263d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
263e0 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74  all PgHdr object
263f0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
26400 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c  Pager.pMmapFreel
26410 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ist list..*/.sta
26420 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
26430 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20  eeMapHdrs(Pager 
26440 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
26450 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70  r *p;.  PgHdr *p
26460 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50  Next;.  for(p=pP
26470 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26480 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ist; p; p=pNext)
26490 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
264a0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c  >pDirty;.    sql
264b0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
264c0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  }.}.../*.** Shut
264d0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
264e0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
264f0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
26500 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
26510 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26520 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
26530 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
26540 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
26550 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
26560 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
26570 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
26580 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
26590 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
265a0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
265b0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
265c0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
265d0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
265e0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
265f0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
26600 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26610 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
26620 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
26630 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
26640 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
26650 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
26660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26670 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
26680 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
26690 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
266a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
266b0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
266c0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
266d0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
266e0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
266f0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
26700 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
26710 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
26720 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26730 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
26740 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
26750 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
26760 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
26770 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
26780 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
26790 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
267a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
267b0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
267c0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
267d0 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72  loc();.  pagerFr
267e0 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72  eeMapHdrs(pPager
267f0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
26800 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
26810 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
26820 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
26830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26840 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
26850 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
26860 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  Wal, pPager->ckp
26870 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
26880 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54  er->pageSize, pT
26890 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
268a0 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
268b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
268c0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
268d0 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
268e0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
268f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
26900 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
26910 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
26920 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
26930 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
26940 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
26950 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
26960 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
26970 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
26980 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
26990 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
269a0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
269b0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
269c0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
269d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
269e0 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
269f0 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
26a00 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
26a10 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
26a20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
26a30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
26a40 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
26a50 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
26a60 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
26a70 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
26a80 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
26a90 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
26aa0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
26ab0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
26ac0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
26ad0 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
26ae0 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
26af0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
26b00 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
26b10 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
26b20 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
26b30 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
26b40 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
26b50 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
26b60 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
26b70 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
26b80 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
26b90 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
26ba0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
26bb0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
26bc0 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
26bd0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
26be0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
26bf0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
26c00 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
26c10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
26c20 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
26c30 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
26c40 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
26c50 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
26c60 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
26c70 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
26c80 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
26c90 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
26ca0 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
26cb0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
26cc0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
26cd0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
26ce0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
26cf0 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
26d00 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
26d10 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
26d20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
26d30 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
26d40 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
26d50 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
26d60 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
26d70 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
26d80 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
26d90 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
26da0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
26db0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
26dc0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
26dd0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
26de0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
26df0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
26e00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
26e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26e20 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
26e30 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
26e40 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
26e50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26e60 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
26e70 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
26e80 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
26e90 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
26ea0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
26eb0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
26ec0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
26ed0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
26ee0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
26ef0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
26f00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
26f10 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
26f20 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
26f30 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
26f40 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
26f50 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
26f60 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
26f70 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
26f80 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
26f90 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
26fa0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
26fb0 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
26fc0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
26fd0 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
26fe0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
26ff0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
27000 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
27010 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
27020 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
27030 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
27040 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
27050 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
27060 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
27070 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
27080 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
27090 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
270a0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
270b0 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c  stics of the fil
270c0 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
270d0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
270e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
270f0 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
27100 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
27110 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
27120 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
27130 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
27140 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
27150 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
27160 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
27170 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
27180 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
27190 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
271a0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
271b0 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
271c0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
271d0 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
271e0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
271f0 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
27200 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
27210 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
27220 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
27230 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
27240 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
27250 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
27260 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
27270 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
27280 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
27290 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
272a0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
272b0 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
272c0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
272d0 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
272e0 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
272f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
27300 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
27310 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
27320 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
27330 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
27340 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
27350 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
27360 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
27370 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
27380 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
27390 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
273a0 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
273b0 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
273c0 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
273d0 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
273e0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
273f0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
27400 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27410 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
27420 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
27430 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
27440 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
27450 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
27460 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
27470 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
27480 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
27490 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
274a0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
274b0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
274c0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
274d0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
274e0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
274f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
27500 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b  er, int newHdr){
27510 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27540 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
27550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27560 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
27570 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
27580 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27590 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
275a0 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
275b0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
275c0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
275d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
275e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
275f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
27600 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
27610 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
27620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27630 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
27640 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27650 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
27660 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
27670 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
27680 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27690 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
276a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
276b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
276c0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
276d0 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
276e0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
276f0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
27700 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
27710 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
27720 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
27730 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
27740 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
27750 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
27760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27770 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
27780 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
27790 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
277a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
277b0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
277c0 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
277d0 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
277e0 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
277f0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
27800 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
27810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
27820 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
27830 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
27840 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
27850 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
27860 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
27870 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
27880 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
27890 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
278a0 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
278b0 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
278c0 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
278d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
278e0 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
278f0 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
27900 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
27910 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
27920 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
27930 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
27940 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
27950 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
27960 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
27970 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
27980 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
27990 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
279a0 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
279b0 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
279c0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
279d0 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
279e0 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
279f0 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
27a00 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
27a10 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
27a20 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
27a30 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
27a40 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
27a50 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
27a60 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
27a70 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
27a80 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
27a90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
27aa0 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
27ab0 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
27ac0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
27ad0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
27ae0 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
27af0 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
27b00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27b10 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
27b20 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
27b30 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
27b40 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
27b50 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
27b60 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
27b70 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
27b80 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
27b90 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
27ba0 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
27bb0 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
27bc0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
27bd0 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
27be0 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
27bf0 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
27c00 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
27c10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
27c20 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
27c30 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
27c40 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
27c50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
27c60 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
27c70 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
27c80 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
27c90 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
27ca0 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
27cb0 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
27cc0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
27cd0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
27ce0 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
27cf0 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
27d00 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
27d10 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
27d20 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
27d30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
27d40 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
27d50 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
27d60 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
27d70 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
27d80 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
27d90 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
27da0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
27db0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
27dc0 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
27dd0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
27de0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
27df0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
27e00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
27e10 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
27e20 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
27e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27e40 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
27e50 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
27e60 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
27e70 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
27e80 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
27e90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
27ea0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
27eb0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
27ec0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
27ed0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
27ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27f00 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
27f10 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
27f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
27f30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
27f40 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
27f50 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
27f60 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
27f70 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
27f80 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
27f90 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
27fa0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
27fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
27fc0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
27fd0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
27fe0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
27ff0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
28000 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
28010 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
28020 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
28030 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
28040 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
28050 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28060 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
28070 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
28080 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
28090 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
280a0 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
280b0 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
280c0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
280d0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
280e0 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
280f0 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
28100 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
28110 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
28120 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
28130 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
28140 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
28150 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
28160 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
28170 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
28180 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
28190 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
281a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
281b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
281c0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
281d0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
281e0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
281f0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
28200 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
28210 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
28220 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
28230 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
28240 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
28250 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
28260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28270 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
28280 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
28290 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
282a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
282b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
282c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
282d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
282e0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
282f0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
28300 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
28310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28320 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
28330 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
28340 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
28350 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
28360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
28370 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28390 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
283a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
283b0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
283c0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
283d0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
283e0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
283f0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28400 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28410 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
28420 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
28430 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
28440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28450 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
28460 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
28470 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
28480 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
28490 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
284a0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
284b0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
284c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
284d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
284e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
284f0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
28500 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28510 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
28520 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
28530 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
28540 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
28550 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
28560 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
28570 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
28580 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
28590 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
285a0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
285b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
285c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
285d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
285e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
285f0 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
28600 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
28610 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
28620 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
28630 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
28640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28650 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
28660 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
28670 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
28680 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
28690 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
286a0 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
286b0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
286c0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
286d0 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
286e0 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
286f0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
28700 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
28710 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28720 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
28730 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
28740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28750 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
28760 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
28770 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
28780 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
28790 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
287a0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
287b0 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
287c0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
287d0 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
287e0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
287f0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
28800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28810 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
28820 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
28830 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
28840 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
28850 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
28860 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
28870 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
28880 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
28890 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
288a0 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
288b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
288c0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
288d0 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
288e0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
288f0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
28900 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
28910 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
28920 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
28930 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
28940 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
28950 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
28960 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
28970 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
28980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28990 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
289a0 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
289b0 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
289c0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
289d0 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
289e0 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
289f0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
28a00 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
28a10 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
28a20 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
28a30 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
28a40 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
28a50 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
28a60 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
28a70 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
28a80 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
28a90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28aa0 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
28ab0 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
28ac0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
28ad0 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
28ae0 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
28af0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
28b00 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
28b10 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
28b20 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
28b30 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
28b40 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
28b50 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
28b60 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
28b70 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
28b80 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
28b90 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
28ba0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
28bb0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
28bc0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
28bd0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
28be0 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
28bf0 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
28c00 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
28c10 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
28c20 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
28c30 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
28c40 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
28c50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
28c60 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
28c70 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
28c80 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
28c90 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
28ca0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
28cb0 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
28cc0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28cd0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
28ce0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
28cf0 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
28d00 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
28d10 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
28d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28d30 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
28d40 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
28d50 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
28d60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28d70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28d90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
28da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28db0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
28dc0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
28dd0 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
28de0 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
28df0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
28e00 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
28e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28e20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28e30 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
28e40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28e50 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
28e60 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
28e70 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
28e80 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
28e90 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
28ea0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
28eb0 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
28ec0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
28ed0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
28ee0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
28ef0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
28f00 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
28f10 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
28f20 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
28f30 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
28f40 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
28f50 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
28f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28f70 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
28f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
28f90 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
28fa0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
28fb0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
28fc0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
28fd0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
28fe0 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
28ff0 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
29000 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
29010 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
29020 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
29030 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
29040 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
29050 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
29060 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
29070 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 28 70  ITE_OK .   && (p
29080 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 3f 20 70  List->pDirty ? p
29090 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
290a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2b 31 29 3e 70  pList->pgno+1)>p
290b0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
290c0 65 20 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e .  ){.    sqli
290d0 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
290e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
290f0 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
29100 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
29110 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
29120 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
29130 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
29140 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
29150 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
29160 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
29170 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
29180 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
29190 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
291a0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
291b0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
291c0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
291d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
291e0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
291f0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
29200 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
29210 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
29220 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
29230 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
29240 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
29250 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
29260 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
29270 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
29280 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
29290 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
292a0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
292b0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
292c0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
292d0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
292e0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
292f0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
29300 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
29310 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
29320 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
29330 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
29340 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29350 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
29360 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
29370 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
29380 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
29390 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
293a0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
293b0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
293c0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
293d0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
293e0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
293f0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
29400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
29430 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
29440 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
29450 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
29460 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
29470 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
29480 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
29490 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
294a0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
294b0 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
294c0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
294d0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
294e0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
294f0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
29500 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
29510 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
29520 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
29530 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
29540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29550 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
29560 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
29570 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
29580 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
29590 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
295a0 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
295b0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
295c0 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
295d0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
295e0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
295f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
29600 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
29610 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
29620 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
29630 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
29640 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
29650 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
29660 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
29670 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
29680 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
29690 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
296a0 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
296b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
296c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
296d0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
296e0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
296f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
29700 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
29710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
29720 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
29730 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
29740 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
29750 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
29760 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
29770 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
29780 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
29790 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
297a0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
297b0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
297c0 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
297d0 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
297e0 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
297f0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
29800 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29810 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
29820 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
29830 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
29840 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
29850 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
29860 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29870 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
29880 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
29890 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
298a0 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
298b0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
298c0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
298d0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
298e0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
298f0 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
29900 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
29910 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
29920 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
29930 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
29940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29950 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
29960 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29970 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
29980 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
29990 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
299a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
299b0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
299c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
299d0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
299e0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
299f0 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
29a00 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
29a10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29a20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
29a30 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
29a40 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
29a50 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
29a60 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
29a70 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
29a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29a90 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29aa0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
29ab0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
29ac0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
29ad0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
29ae0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
29af0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
29b00 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
29b10 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
29b20 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
29b30 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29b40 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
29b50 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
29b60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
29b70 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
29b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29b90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
29ba0 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
29bb0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
29bc0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
29bd0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
29be0 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
29bf0 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
29c00 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
29c10 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
29c20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
29c30 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
29c40 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
29c50 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
29c60 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
29c70 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
29c80 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
29c90 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
29ca0 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
29cb0 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
29cc0 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
29cd0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29ce0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
29cf0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
29d00 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
29d10 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
29d20 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
29d30 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
29d40 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
29d50 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
29d60 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
29d70 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
29d80 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
29d90 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
29da0 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
29db0 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
29dc0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
29dd0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
29de0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29df0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
29e00 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
29e10 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
29e20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29e30 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
29e40 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
29e50 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
29e60 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
29e70 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
29e80 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
29e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29ea0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
29eb0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
29ec0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29ed0 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
29ee0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
29ef0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
29f00 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
29f10 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
29f20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29f30 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
29f40 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
29f50 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
29f60 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
29f70 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
29f80 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
29f90 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
29fa0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
29fb0 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
29fc0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
29fd0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
29fe0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
29ff0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2a000 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
2a010 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2a020 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2a030 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2a040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a050 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2a060 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2a070 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2a080 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2a090 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2a0a0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2a0b0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
2a0c0 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
2a0d0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2a0e0 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2a0f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
2a100 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2a110 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2a120 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2a130 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a140 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2a150 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2a160 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2a170 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2a180 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2a190 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a1a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a1b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a1c0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2a1d0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2a1e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a1f0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2a200 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a220 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2a230 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2a240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2a250 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2a260 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2a270 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2a280 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2a290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a2b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a2c0 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2a2d0 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2a2e0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2a2f0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2a300 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2a310 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2a320 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2a330 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2a340 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2a350 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2a360 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2a370 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2a380 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2a390 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a3a0 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2a3b0 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2a3c0 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2a3d0 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2a3e0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2a3f0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2a400 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2a410 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a420 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2a430 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2a440 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2a450 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2a460 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2a470 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2a480 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2a490 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2a4a0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2a4b0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2a4c0 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2a4d0 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2a4e0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2a4f0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2a500 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2a510 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2a520 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2a530 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2a540 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2a550 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2a560 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a570 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2a580 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2a590 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2a5a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a5b0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2a5c0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2a5d0 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2a5e0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2a5f0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2a600 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2a610 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2a620 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2a630 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2a640 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2a650 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a660 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2a670 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2a680 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2a690 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2a6a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a6b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2a6c0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2a6d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2a6e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a6f0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2a700 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
2a710 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
2a720 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2a730 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2a740 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2a750 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2a760 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2a770 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2a780 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2a790 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2a7a0 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2a7b0 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2a7c0 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2a7d0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2a7e0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2a7f0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2a800 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
2a810 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
2a820 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
2a830 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2a840 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
2a850 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2a860 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2a870 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
2a880 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
2a890 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2a8a0 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2a8b0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2a8c0 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2a8d0 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2a8e0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2a8f0 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2a900 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2a910 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
2a920 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2a930 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2a940 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2a950 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2a960 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
2a970 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2a980 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2a990 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2a9a0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2a9b0 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2a9c0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2a9d0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2a9e0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2a9f0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2aa00 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2aa10 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2aa20 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2aa30 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2aa40 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2aa50 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2aa60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2aa70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2aa80 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
2aa90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
2aaa0 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2aab0 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
2aac0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2aad0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
2aae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2aaf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2ab00 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2ab10 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2ab20 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2ab30 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2ab40 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2ab50 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2ab60 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
2ab70 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2ab80 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
2ab90 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2aba0 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
2abb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2abc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2abd0 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2abe0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2abf0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2ac00 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2ac10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2ac20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2ac30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2ac40 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2ac50 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2ac60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ac70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2ac80 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2ac90 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2aca0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2acb0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2acc0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
2acd0 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
2ace0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2acf0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2ad00 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
2ad10 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
2ad20 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
2ad30 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2ad40 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
2ad50 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
2ad60 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
2ad70 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2ad80 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
2ad90 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
2ada0 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
2adb0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
2adc0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
2add0 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
2ade0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
2adf0 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
2ae00 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
2ae10 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
2ae20 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
2ae30 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2ae40 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
2ae50 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
2ae60 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
2ae70 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
2ae80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2ae90 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
2aea0 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
2aeb0 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
2aec0 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
2aed0 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
2aee0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
2aef0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
2af00 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
2af10 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
2af20 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
2af30 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2af40 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
2af50 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
2af60 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
2af70 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
2af80 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
2af90 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
2afa0 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
2afb0 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
2afc0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
2afd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2afe0 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
2aff0 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
2b000 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
2b010 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
2b020 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
2b030 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
2b040 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
2b050 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
2b060 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
2b070 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
2b080 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
2b090 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
2b0a0 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
2b0b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
2b0c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
2b0d0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
2b0e0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
2b0f0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
2b100 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
2b110 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
2b120 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
2b130 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
2b140 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
2b150 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
2b160 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
2b170 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
2b180 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
2b190 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2b1a0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2b1b0 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
2b1c0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
2b1d0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2b1e0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2b1f0 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2b200 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2b210 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2b220 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2b230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b240 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2b250 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2b260 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b270 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2b280 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2b290 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2b2a0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2b2b0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2b2c0 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2b2d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b2e0 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2b2f0 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2b300 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2b310 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2b320 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2b330 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2b340 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2b350 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2b360 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2b370 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ); .}.../*.** Al
2b380 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2b390 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
2b3a0 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
2b3b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2b3c0 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
2b3d0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
2b3e0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
2b3f0 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
2b400 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
2b410 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
2b420 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
2b430 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
2b440 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
2b450 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2b460 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
2b470 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
2b480 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
2b490 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
2b4a0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
2b4b0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
2b4c0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
2b4d0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
2b4e0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
2b4f0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
2b500 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
2b510 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
2b520 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
2b530 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
2b540 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
2b550 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
2b560 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
2b570 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
2b580 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2b590 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2b5a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2b5b0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2b5c0 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2b5d0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2b5e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2b5f0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2b600 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2b610 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2b620 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2b630 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2b640 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2b650 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2b660 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
2b670 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2b680 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2b690 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2b6a0 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2b6b0 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2b6c0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2b6d0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2b6e0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2b6f0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2b700 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2b710 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2b720 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2b730 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2b740 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2b750 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2b760 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2b770 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2b780 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2b790 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2b7a0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2b7b0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2b7c0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2b7d0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2b7e0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2b7f0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2b800 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2b810 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2b820 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2b830 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2b840 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2b850 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2b860 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2b870 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2b880 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2b890 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2b8a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b8b0 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2b8c0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2b8d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2b8e0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2b8f0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2b900 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2b910 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2b920 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2b930 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2b940 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2b950 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2b960 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2b970 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2b980 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2b990 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2b9a0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b9b0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2b9c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b9d0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2b9e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b9f0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2ba00 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2ba10 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2ba20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2ba30 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2ba40 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2ba50 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2ba60 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2ba70 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2ba80 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2ba90 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2baa0 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2bab0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2bac0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2bad0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2bae0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2baf0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2bb00 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2bb10 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2bb20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2bb30 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2bb40 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2bb50 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2bb60 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2bb70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2bb80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2bb90 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2bba0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2bbb0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2bbc0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2bbd0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2bbe0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2bbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bc00 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2bc10 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2bc20 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2bc30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2bc40 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2bc50 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2bc60 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2bc70 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2bc80 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2bc90 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2bca0 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2bcb0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2bcc0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2bcd0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2bce0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2bcf0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2bd00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2bd10 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2bd20 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2bd30 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2bd40 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2bd50 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2bd60 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2bd70 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2bd80 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2bd90 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2bda0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2bdb0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2bdc0 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2bdd0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2bde0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bdf0 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2be00 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2be10 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2be20 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2be30 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2be40 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2be50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2be60 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2be70 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2be80 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2be90 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2bea0 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2beb0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2bec0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2bed0 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2bee0 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2bef0 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2bf00 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2bf10 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
2bf20 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
2bf30 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
2bf40 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
2bf50 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
2bf60 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
2bf70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
2bf80 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
2bf90 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
2bfa0 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
2bfb0 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
2bfc0 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
2bfd0 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
2bfe0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
2bff0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
2c000 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
2c010 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
2c020 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2c030 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
2c040 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
2c050 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
2c060 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
2c070 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
2c080 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2c090 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
2c0a0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2c0b0 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2c0c0 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
2c0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
2c0e0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2c0f0 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
2c100 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
2c110 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2c120 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2c130 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2c140 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2c150 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2c160 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2c170 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2c180 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2c190 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2c1a0 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2c1b0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2c1c0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2c1d0 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2c1e0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2c1f0 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2c200 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2c210 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2c220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c230 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  MEM;.      nPath
2c240 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2c250 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2c260 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2c270 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2c280 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2c290 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2c2a0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2c2b0 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2c2c0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2c2d0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2c2e0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2c2f0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2c300 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2c310 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2c320 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2c330 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2c340 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2c350 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2c360 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2c370 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2c380 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2c390 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2c3a0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2c3b0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2c3c0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2c3d0 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2c3e0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2c3f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2c400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c410 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2c420 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2c430 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2c440 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2c450 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2c460 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2c470 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2c480 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2c490 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2c4a0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2c4b0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2c4c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c4d0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2c4e0 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2c4f0 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2c500 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2c510 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2c520 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2c530 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c540 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2c550 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c560 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2c570 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2c580 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2c590 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2c5a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2c5b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2c5c0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2c5d0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2c5e0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2c5f0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2c600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2c610 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2c620 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2c630 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2c640 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2c650 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2c660 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2c670 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2c680 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2c690 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2c6a0 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2c6b0 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2c6c0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2c6d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2c6e0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2c6f0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2c700 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2c710 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2c720 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2c730 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2c740 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2c750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2c770 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2c780 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2c790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2c7a0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2c7b0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2c7c0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2c7d0 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2c7e0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2c7f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c800 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2c810 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2c820 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2c830 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2c840 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2c850 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2c860 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2c870 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2c890 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2c8a0 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2c8b0 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2c8d0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c8e0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c8f0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2c900 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2c910 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2c920 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c930 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2c940 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2c950 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2c960 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2c970 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2c980 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2c990 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2c9a0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2c9b0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2c9c0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2c9d0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2c9e0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c9f0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2ca00 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2ca10 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2ca20 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2ca30 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2ca40 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2ca50 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2ca60 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2ca70 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2ca80 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2ca90 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2caa0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2cab0 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2cac0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2cad0 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2cae0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2caf0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2cb00 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2cb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cb20 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2cb30 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2cb40 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2cb50 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2cb60 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2cb70 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20  athname + 8 + 2 
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb90 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2cba0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cbb0 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2cbc0 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20  ame + 4 + 2     
2cbd0 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2cbe0 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2cbf0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2cc00 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2cc10 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2cc20 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2cc30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2cc40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2cc50 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2cc60 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2cc70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2cc80 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2cc90 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2cca0 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2ccb0 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2ccc0 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2ccd0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2cce0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2ccf0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2cd00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2cd10 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2cd20 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2cd30 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2cd40 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2cd50 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2cd60 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2cd70 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2cd80 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2cd90 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2cda0 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2cdb0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2cdc0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2cdd0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2cde0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2cdf0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2ce00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2ce10 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2ce20 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2ce30 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2ce40 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2ce50 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2ce60 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2ce70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2ce80 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2ce90 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2cea0 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2ceb0 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2cec0 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2ced0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2cee0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2cef0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2cf00 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2cf10 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2cf20 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2cf30 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2cf40 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2cf50 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2cf60 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2cf70 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2cf80 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2cf90 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2cfa0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2cfb0 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2cfc0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2cfd0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2cfe0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2cff0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2d000 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d010 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2d020 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2d030 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2d040 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2d050 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2d060 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d070 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d080 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2d090 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2d0a0 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2d0b0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2d0c0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d0d0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2d0e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2d0f0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2d100 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2d110 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2d120 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2d130 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2d140 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2d150 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2d160 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2d170 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2d180 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2d190 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d1b0 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2d1c0 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2d1d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d1e0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2d1f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d200 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2d210 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2d220 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2d230 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2d240 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2d250 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2d260 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2d270 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2d280 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2d290 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2d2a0 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2d2b0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2d2c0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2d2d0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2d2e0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2d2f0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2d300 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d310 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2d320 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2d330 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2d340 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2d350 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2d360 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2d370 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2d380 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2d390 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2d3a0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2d3b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2d3c0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2d3d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d3e0 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
2d3f0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
2d400 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2d410 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
2d420 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2d430 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2d440 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d450 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2d460 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2d470 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2d480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
2d490 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2d4a0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2d4b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
2d4d0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2d4e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d4f0 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2d500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d510 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2d520 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2d530 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2d540 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
2d550 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2d560 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2d570 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
2d580 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2d590 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d5a0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2d5b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
2d5c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d5d0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2d5e0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2d5f0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2d600 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2d610 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
2d620 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
2d630 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2d640 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2d650 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2d660 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2d670 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2d680 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d690 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2d6a0 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
2d6b0 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
2d6c0 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
2d6d0 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
2d6e0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2d6f0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
2d700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d710 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2d720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2d730 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2d740 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2d750 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2d760 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2d770 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2d780 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2d790 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d7a0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2d7b0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2d7c0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2d7d0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2d7e0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2d7f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2d800 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2d810 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2d820 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d830 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2d840 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2d850 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2d860 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2d870 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2d880 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2d890 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2d8a0 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2d8b0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2d8c0 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
2d8d0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2d8e0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2d8f0 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
2d900 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2d910 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
2d920 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2d930 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2d940 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2d950 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2d960 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2d970 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2d980 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2d990 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2d9a0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2d9b0 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2d9c0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2d9d0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2d9e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2da00 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2da10 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2da20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2da30 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2da40 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2da50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2da60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2da70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2da80 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2da90 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
2daa0 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
2dab0 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
2dac0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2dad0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2dae0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2daf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2db00 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2db10 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
2db20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2db30 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2db40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2db50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
2db60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2db70 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2db80 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
2db90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
2dba0 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
2dbb0 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
2dbc0 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
2dbd0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2dbe0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2dbf0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2dc10 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2dc20 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2dc30 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2dc40 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
2dc50 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2dc60 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2dc70 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2dc80 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2dc90 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2dca0 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2dcb0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2dcc0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2dcd0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2dce0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2dcf0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2dd00 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2dd10 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2dd20 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2dd30 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2dd40 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2dd50 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2dd60 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2dd70 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2dd80 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2dd90 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2dda0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2ddb0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2ddc0 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2ddd0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2dde0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2ddf0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
2de00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
2de10 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
2de20 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
2de30 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
2de40 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
2de50 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2de60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2de70 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2de80 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2de90 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2dea0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2deb0 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2dec0 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2ded0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2dee0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2def0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2df00 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2df10 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2df20 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2df30 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2df40 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2df50 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2df60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2df70 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2df80 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2df90 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2dfa0 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2dfb0 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2dfc0 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2dfd0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2dfe0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2dff0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2e000 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2e010 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2e020 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2e030 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2e040 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2e050 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2e060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e070 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2e080 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e090 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2e0a0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2e0b0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2e0c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2e0d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2e0e0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e0f0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2e100 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2e110 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2e120 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2e130 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2e140 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2e150 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2e160 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2e170 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2e180 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2e190 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e1a0 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2e1b0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e1c0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2e1d0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2e1e0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2e1f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2e200 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2e210 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2e220 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2e230 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2e240 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2e250 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2e260 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e270 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2e280 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2e290 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2e2a0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2e2b0 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2e2c0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2e2d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2e2e0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2e2f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2e300 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2e310 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2e320 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2e330 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2e340 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2e350 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2e360 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2e370 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2e380 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2e390 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2e3a0 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2e3b0 65 72 2d 3e 6d 78 4d 6d 61 70 20 3d 20 53 51 4c  er->mxMmap = SQL
2e3c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2e3d0 5f 4c 49 4d 49 54 20 2f 2f 20 77 69 6c 6c 20 62  _LIMIT // will b
2e3e0 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2e3f0 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2e400 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2e410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e420 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2e430 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2e440 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
2e450 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
2e460 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
2e470 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
2e480 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
2e490 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2e4a0 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
2e4b0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
2e4c0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
2e4d0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
2e4e0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
2e4f0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
2e500 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
2e510 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
2e520 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
2e530 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
2e540 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
2e550 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2e560 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
2e570 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
2e580 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
2e590 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
2e5a0 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
2e5b0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2e5c0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
2e5d0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2e5e0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
2e5f0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2e600 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2e610 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2e620 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
2e630 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2e640 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
2e650 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e660 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
2e670 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
2e680 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
2e690 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2e6a0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
2e6b0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
2e6c0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
2e6d0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
2e6e0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
2e6f0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
2e700 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
2e710 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
2e720 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2e730 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2e740 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
2e750 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
2e760 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2e770 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
2e780 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2e790 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
2e7a0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
2e7b0 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
2e7c0 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
2e7d0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
2e7e0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2e7f0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2e800 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
2e810 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2e820 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
2e830 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
2e840 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2e850 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
2e860 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
2e870 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2e880 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
2e890 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
2e8a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
2e8b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
2e8c0 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
2e8d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2e8e0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
2e8f0 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
2e900 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
2e910 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
2e920 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
2e930 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
2e940 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2e950 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
2e960 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2e970 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
2e980 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
2e990 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
2e9a0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2e9b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2e9c0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2e9d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2e9e0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
2e9f0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2ea00 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
2ea10 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
2ea20 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
2ea30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2ea40 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2ea50 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
2ea60 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2ea70 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
2ea80 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2ea90 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
2eaa0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
2eab0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2eac0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
2ead0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2eae0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
2eaf0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2eb00 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb20 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
2eb30 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2eb40 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
2eb50 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
2eb60 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
2eb70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eb80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2eb90 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2eba0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2ebb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ebc0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2ebd0 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
2ebe0 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
2ebf0 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
2ec00 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2ec10 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
2ec20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
2ec30 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
2ec40 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
2ec50 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
2ec60 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2ec70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2ec80 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
2ec90 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2eca0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
2ecb0 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
2ecc0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
2ecd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2ece0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
2ecf0 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
2ed00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ed10 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
2ed20 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2ed30 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
2ed40 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
2ed50 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
2ed60 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
2ed70 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
2ed80 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
2ed90 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
2eda0 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
2edb0 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
2edc0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
2edd0 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
2ede0 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
2edf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
2ee00 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
2ee10 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
2ee20 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
2ee30 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
2ee40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2ee50 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
2ee60 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
2ee70 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
2ee80 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
2ee90 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2eea0 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
2eeb0 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
2eec0 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
2eed0 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
2eee0 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
2eef0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2ef00 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
2ef10 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
2ef20 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
2ef30 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
2ef40 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
2ef50 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
2ef60 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
2ef70 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2ef80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
2ef90 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
2efa0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
2efb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2efc0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2efd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2efe0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
2eff0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2f000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2f010 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
2f020 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
2f030 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
2f040 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f050 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
2f060 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
2f070 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
2f080 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
2f090 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
2f0a0 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
2f0b0 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
2f0c0 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
2f0d0 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
2f0e0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
2f0f0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
2f100 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
2f110 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
2f120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
2f130 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
2f140 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
2f150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f160 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2f170 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
2f180 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
2f190 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
2f1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f1b0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
2f1c0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
2f1d0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
2f1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f1f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
2f200 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f210 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
2f220 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
2f230 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f240 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
2f250 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2f260 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
2f270 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2f280 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
2f290 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
2f2a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2f2b0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2f2c0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
2f2d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2f2e0 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
2f2f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
2f300 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2f310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f320 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
2f330 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
2f340 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
2f350 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
2f360 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
2f370 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
2f380 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
2f390 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
2f3a0 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
2f3b0 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
2f3c0 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
2f3d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
2f3e0 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
2f3f0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
2f400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2f410 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2f420 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
2f430 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2f440 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
2f450 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2f460 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f470 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2f480 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f490 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2f4a0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
2f4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f4c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f4d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f4e0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
2f4f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f500 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
2f510 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
2f520 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
2f530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2f540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
2f550 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
2f560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2f570 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f580 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2f590 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
2f5a0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
2f5b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2f5c0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
2f5d0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
2f5e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
2f5f0 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
2f600 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
2f610 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2f620 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
2f630 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2f640 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
2f650 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
2f660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
2f670 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
2f680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2f690 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  s has a zero hea
2f6a0 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
2f6b0 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
2f6c0 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
2f6d0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
2f6e0 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
2f6f0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
2f700 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
2f710 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
2f720 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
2f730 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
2f740 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2f750 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
2f760 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f770 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
2f780 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
2f790 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
2f7a0 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
2f7b0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
2f7c0 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
2f7d0 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
2f7e0 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
2f7f0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
2f800 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
2f810 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2f820 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
2f830 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
2f840 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
2f850 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
2f860 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
2f870 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2f880 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
2f890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f8a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f8d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2f8e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f8f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f900 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
2f910 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
2f920 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2f930 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
2f940 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
2f950 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
2f960 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
2f970 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
2f980 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
2f990 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
2f9a0 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
2f9b0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
2f9c0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
2f9d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2f9e0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
2f9f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
2fa00 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
2fa10 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
2fa20 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
2fa30 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
2fa40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2fa50 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
2fa60 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
2fa70 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
2fa80 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
2fa90 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
2faa0 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
2fab0 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
2fac0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
2fad0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2fae0 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
2faf0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
2fb00 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
2fb10 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
2fb20 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
2fb30 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
2fb40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
2fb50 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
2fb60 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
2fb70 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
2fb80 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
2fb90 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
2fba0 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
2fbb0 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
2fbc0 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
2fbd0 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
2fbe0 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
2fbf0 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
2fc00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2fc10 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
2fc20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
2fc30 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
2fc40 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
2fc50 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
2fc60 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2fc70 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2fc80 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
2fc90 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
2fca0 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
2fcb0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
2fcc0 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
2fcd0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
2fce0 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
2fcf0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2fd00 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
2fd10 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
2fd20 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
2fd30 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
2fd40 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
2fd50 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
2fd60 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
2fd70 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
2fd80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
2fd90 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2fda0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
2fdb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2fdc0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
2fdd0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
2fde0 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
2fdf0 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
2fe00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2fe10 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
2fe20 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
2fe30 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
2fe40 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2fe50 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
2fe60 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
2fe70 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
2fe80 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2fe90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2fea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2feb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2fec0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2fed0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
2fee0 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
2fef0 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
2ff00 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
2ff10 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
2ff20 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
2ff30 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
2ff40 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
2ff50 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
2ff60 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
2ff70 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
2ff80 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
2ff90 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
2ffa0 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
2ffb0 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
2ffc0 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
2ffd0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2ffe0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
2fff0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
30000 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
30010 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
30020 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30030 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
30040 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30050 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
30060 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
30070 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
30080 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
30090 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
300a0 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72   }..  if( !pager
300b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
300c0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
300d0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  ==PAGER_OPEN ){.
300e0 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72      int bHotJour
300f0 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  nal = 1;        
30100 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
30110 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20  re exists a hot 
30120 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a  journal-file */.
30130 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
30140 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  MDB );..    rc =
30150 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
30160 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
30170 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
30180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30190 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
301a0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
301b0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
301c0 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
301d0 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
301e0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
301f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
30200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30210 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
30220 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
30230 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
30240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30250 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
30260 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
30270 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
30280 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
30290 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
302a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
302b0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
302c0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
302d0 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
302e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
302f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30300 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
30310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30320 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
30330 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
30340 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
30350 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30360 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
30370 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
30380 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
30390 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
303a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
303b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
303c0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
303d0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
303e0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
303f0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
30400 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
30410 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
30420 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
30430 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
30440 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
30450 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
30460 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
30470 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
30480 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
30490 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
304a0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
304b0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
304c0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
304d0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
304e0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
304f0 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
30500 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
30510 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
30520 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
30530 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
30540 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
30550 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
30560 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
30570 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
30580 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
30590 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
305a0 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
305b0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
305c0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
305d0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
305e0 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
305f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
30600 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
30610 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
30620 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
30630 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
30640 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
30650 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
30660 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
30670 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
30680 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
30690 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
306a0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
306b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
306c0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
306d0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
306e0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
306f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30700 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
30710 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
30720 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
30730 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
30740 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
30750 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
30760 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
30770 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
30780 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
30790 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
307a0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
307b0 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
307c0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
307d0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
307e0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
307f0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
30800 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
30810 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
30820 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
30830 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
30840 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
30850 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
30860 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
30870 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
30880 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
30890 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
308a0 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
308b0 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
308c0 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
308d0 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
308e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
308f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
30900 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
30910 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
30920 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
30930 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
30940 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
30950 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
30960 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
30970 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
30980 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
30990 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
309a0 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
309b0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
309c0 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
309d0 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
309e0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
309f0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
30a00 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
30a10 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
30a20 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
30a30 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
30a40 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
30a50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
30a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30a70 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
30a80 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
30a90 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
30aa0 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
30ab0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
30ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30ad0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
30ae0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
30af0 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
30b00 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30b10 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
30b20 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
30b30 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
30b40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30b50 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
30b60 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
30b70 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
30b80 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
30b90 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
30ba0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
30bb0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
30bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
30bd0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
30be0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30bf0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
30c00 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
30c10 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
30c20 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
30c30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30c40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
30c50 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
30c60 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
30c70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30c80 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
30c90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30ca0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
30cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
30cc0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
30cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30ce0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
30cf0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
30d00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30d10 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
30d20 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
30d30 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
30d40 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
30d50 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
30d60 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
30d70 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
30d80 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
30d90 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
30da0 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
30db0 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
30dc0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
30dd0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
30de0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
30df0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
30e00 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
30e10 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
30e20 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
30e30 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
30e40 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
30e50 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
30e60 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
30e70 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
30e80 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
30e90 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
30ea0 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
30eb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
30ec0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
30ed0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
30ee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
30ef0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30f00 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
30f10 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30f20 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
30f30 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
30f40 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
30f50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30f60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30f70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
30f80 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
30f90 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
30fa0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
30fb0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
30fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30fd0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
30fe0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
30ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
31000 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
31010 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
31020 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
31030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31040 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
31050 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
31060 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
31070 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
31080 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
31090 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
310a0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
310b0 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
310c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
310d0 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
310e0 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
310f0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
31100 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
31110 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
31120 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
31130 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
31140 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
31150 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
31160 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
31170 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
31180 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
31190 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
311a0 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
311b0 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
311c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
311d0 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
311e0 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
311f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
31200 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
31210 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
31220 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
31230 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
31240 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
31250 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
31260 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
31270 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
31280 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
31290 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
312a0 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
312b0 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
312c0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
312d0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
312e0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
312f0 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
31300 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
31310 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
31320 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
31330 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
31340 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
31350 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
31360 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
31370 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
31380 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
31390 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
313a0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
313b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
313c0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
313d0 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
313e0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
313f0 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
31400 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
31410 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
31420 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
31430 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
31440 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31450 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31460 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31470 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
31480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
31490 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
314a0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
314b0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
314c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
314d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
314e0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
314f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
31500 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
31510 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a 20 20  tempFile && (.  
31520 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
31530 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20 73  ackup .     || s
31540 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
31550 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
31560 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 7c  Cache)>0 .     |
31570 7c 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  | USEFETCH(pPage
31580 72 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  r).    )){.     
31590 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
315a0 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
315b0 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
315c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
315d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
315e0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
315f0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
31600 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
31610 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
31620 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
31630 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
31640 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
31650 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
31660 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
31670 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
31680 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
31690 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
316a0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
316b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
316c0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
316d0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
316e0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
316f0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
31700 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
31710 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
31720 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
31730 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
31740 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
31750 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
31760 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
31770 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
31780 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
31790 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
317a0 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
317b0 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
317c0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
317d0 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
317e0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
317f0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
31800 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
31810 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
31820 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
31830 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
31840 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
31850 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
31860 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
31870 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
31880 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
31890 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
318a0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   */.      Pgno n
318b0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
318c0 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
318d0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
318e0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20  bFileVers)];..  
318f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
31900 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
31910 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
31920 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69  f( rc ) goto fai
31930 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  led;..      if( 
31940 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20  nPage>0 ){.     
31950 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
31960 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
31970 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
31980 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
31990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
319a0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
319b0 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
319c0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
319d0 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
319e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
319f0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
31a00 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
31a10 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  D ){.          g
31a20 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31a30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
31a40 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
31a50 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
31a60 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
31a70 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
31a80 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
31a90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
31aa0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
31ab0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
31ac0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
31ad0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
31ae0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
31af0 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74  /* Unmap the dat
31b00 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69  abase file. It i
31b10 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
31b20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73  external process
31b30 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  es.        ** ma
31b40 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64  y have truncated
31b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31b60 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65  le and then exte
31b70 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20  nded it back.   
31b80 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f       ** to its o
31b90 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69  riginal size whi
31ba0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
31bb0 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20  was not holding 
31bc0 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  a lock..        
31bd0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
31be0 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20  there may exist 
31bf0 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70  a Pager.pMap map
31c00 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72  ping that appear
31c10 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  s.        ** to 
31c20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  be the right siz
31c30 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74  e but is not act
31c40 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f  ually valid. Avo
31c50 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  id this.        
31c60 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62  ** possibility b
31c70 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20  y unmapping the 
31c80 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  db here. */.    
31c90 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
31ca0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
31cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
31cc0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
31cd0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
31ce0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31cf0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
31d00 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65  re is a WAL file
31d10 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
31d20 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64  tem, open this d
31d30 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20  atabase in WAL. 
31d40 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65     ** mode. Othe
31d50 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  rwise, the follo
31d60 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  wing function ca
31d70 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
31d80 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
31d90 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
31da0 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69  sent(pPager);.#i
31db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31dc0 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74  T_WAL.    assert
31dd0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
31de0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
31df0 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  OK );.#endif.  }
31e00 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
31e10 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
31e20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
31e30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
31e40 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
31e50 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
31e60 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
31e70 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
31e80 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
31e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31ea0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
31eb0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
31ec0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
31ed0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
31ee0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
31ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
31f00 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
31f10 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
31f20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
31f30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31f40 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31f50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31f60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
31f70 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
31f80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
31f90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
31fa0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
31fb0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
31fc0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
31fd0 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
31fe0 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
31ff0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
32000 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
32010 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
32020 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
32030 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
32040 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
32050 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
32060 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
32070 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
32080 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
32090 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
320a0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
320b0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
320c0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
320d0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
320e0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
320f0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d  Pager->nMmapOut=
32100 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63  =0 && (sqlite3Pc
32110 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
32120 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
32130 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e  ) ){.    pagerUn
32140 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
32150 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
32160 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
32170 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
32180 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
32190 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
321a0 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
321b0 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
321c0 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
321d0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
321e0 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
321f0 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
32200 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
32210 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
32220 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
32230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
32240 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
32250 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
32260 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
32270 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
32280 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
32290 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
322a0 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
322b0 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
322c0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
322d0 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
322e0 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
322f0 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
32300 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
32310 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
32320 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
32330 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
32340 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
32350 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
32360 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
32370 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
32380 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
32390 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
323a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
323b0 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
323c0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
323d0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
323e0 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
323f0 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
32400 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
32410 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
32420 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
32430 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
32440 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
32450 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
32460 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
32470 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
32480 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
32490 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
324a0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
324b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
324c0 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
324d0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
324e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
324f0 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
32500 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
32510 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
32520 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
32530 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
32540 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
32550 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
32560 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
32570 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
32580 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
32590 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
325a0 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
325b0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
325c0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
325d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
325e0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
325f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
32600 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
32610 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
32620 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
32630 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
32640 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
32650 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
32660 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
32670 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
32680 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
32690 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
326a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
326b0 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
326c0 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
326d0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
326e0 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
326f0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
32700 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
32710 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
32720 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
32730 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
32740 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
32750 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
32760 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
32770 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
32780 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
32790 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
327a0 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
327b0 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
327c0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
327d0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
327e0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
327f0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
32800 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
32810 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
32820 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
32830 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
32840 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
32850 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
32860 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
32870 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
32880 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
32890 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
328a0 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
328b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
328c0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
328d0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
328e0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
328f0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
32900 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
32910 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
32920 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
32930 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
32940 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
32950 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
32960 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
32970 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
32980 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
32990 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
329a0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
329b0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
329c0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
329d0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
329e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
329f0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
32a00 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
32a10 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
32a20 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
32a30 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
32a40 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
32a50 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
32a60 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
32a70 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
32a80 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
32a90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
32aa0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
32ab0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
32ac0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
32ad0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
32ae0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
32af0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
32b00 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
32b10 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
32b20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
32b30 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
32b40 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
32b50 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
32b60 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
32b70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
32b80 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
32b90 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
32ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
32bb0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
32bc0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
32bd0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
32be0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
32bf0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
32c00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
32c10 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
32c20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
32c30 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 41 43       /* PAGER_AC
32c40 51 55 49 52 45 5f 58 58 58 20 66 6c 61 67 73 20  QUIRE_XXX flags 
32c50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
32c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
32c70 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
32c80 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20  u32 iFrame = 0; 
32c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ca0 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64  /* Frame to read
32cb0 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a   from WAL file *
32cc0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f  /.  const int no
32cd0 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73  Content = (flags
32ce0 20 26 20 50 41 47 45 52 5f 41 43 51 55 49 52 45   & PAGER_ACQUIRE
32cf0 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20  _NOCONTENT);..  
32d00 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
32d10 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
32d20 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
32d30 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
32d40 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
32d50 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
32d60 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
32d70 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
32d80 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
32d90 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
32da0 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
32db0 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
32dc0 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
32dd0 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
32de0 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
32df0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
32e00 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
32e10 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31  mapOk = (pgno!=1
32e20 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
32e30 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
32e40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32e50 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
32e60 67 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49  gs & PAGER_ACQUI
32e70 52 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20  RE_READONLY)).  
32e80 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
32e90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
32ea0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
32eb0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
32ec0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
32ed0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
32ee0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20  noContent==0 || 
32ef0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20  bMmapOk==0 );.. 
32f00 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
32f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32f20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32f30 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32f40 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
32f50 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
32f60 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
32f70 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
32f80 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
32f90 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
32fa0 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
32fb0 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
32fc0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
32fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
32fe0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
32ff0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  ode;.  }else{.. 
33000 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
33010 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
33020 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
33030 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
33040 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
33050 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
33060 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33080 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33090 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
330a0 20 20 20 69 66 28 20 69 46 72 61 6d 65 3d 3d 30     if( iFrame==0
330b0 20 26 26 20 62 4d 6d 61 70 4f 6b 20 29 7b 0a 20   && bMmapOk ){. 
330c0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
330d0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
330e0 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
330f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
33100 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67          (i64)(pg
33110 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
33120 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72  pageSize, pPager
33130 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61  ->pageSize, &pDa
33140 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  ta.      );..   
33150 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33160 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
33170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
33180 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
33190 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20  R_READER ){.    
331a0 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
331b0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
331c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
331d0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
331e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
331f0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
33200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
33210 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
33220 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  ge(pPager, pgno,
33230 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20   pData, &pPg);. 
33240 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33260 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33270 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
33280 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
33290 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
332a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
332b0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
332c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
332d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
332e0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
332f0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20   pPg;.          
33300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33320 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33340 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
33350 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
33380 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
33390 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
333a0 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d   1, ppPage);.  }
333b0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
333c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
333d0 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  Either the call 
333e0 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
333f0 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64  Fetch() returned
33400 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65   an error or the
33410 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61  .    ** pager wa
33420 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
33430 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
33440 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
33450 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
33460 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20  ** Set pPg to 0 
33470 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  and jump to the 
33480 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65  exception handle
33490 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  r.  */.    pPg =
334a0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   0;.    goto pag
334b0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
334c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
334d0 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
334e0 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
334f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
33500 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a  er==pPager || (*
33510 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
33520 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70  =0 );..  if( (*p
33530 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26  pPage)->pPager &
33540 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
33550 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
33560 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
33570 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
33580 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
33590 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
335a0 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
335b0 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
335c0 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
335d0 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
335e0 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
335f0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
33600 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
33610 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
33620 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a  ER_STAT_HIT]++;.
33630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33640 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
33650 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
33660 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
33670 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
33680 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
33690 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
336a0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
336b0 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
336c0 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
336d0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
336e0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
336f0 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
33700 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
33710 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
33720 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
33730 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
33740 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
33750 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
33760 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
33770 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
33780 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
33790 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
337a0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
337b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
337c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
337d0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
337e0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
337f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33800 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
33810 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
33820 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
33830 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
33840 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
33850 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
33860 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
33870 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
33880 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
33890 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
338a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
338b0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
338c0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
338d0 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
338e0 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
338f0 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
33900 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
33910 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
33920 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
33930 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
33940 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
33950 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
33960 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
33970 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
33980 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
33990 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
339a0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
339b0 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
339c0 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
339d0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
339e0 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
339f0 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
33a00 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
33a10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
33a20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
33a30 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
33a40 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
33a50 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
33a60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
33a70 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
33a80 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
33a90 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
33aa0 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
33ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
33ad0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
33ae0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
33af0 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
33b00 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
33b10 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
33b20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
33b30 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
33b40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33b50 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
33b60 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
33b70 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
33b80 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
33b90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
33ba0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
33bb0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
33bc0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
33bd0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
33be0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33bf0 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30  r) && bMmapOk==0
33c00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33c10 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
33c20 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
33c30 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
33c40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33c50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
33c60 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
33c70 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
33c80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
33c90 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
33ca0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
33cb0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
33cc0 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
33cd0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
33ce0 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
33cf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33d00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33d10 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
33d20 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
33d30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
33d40 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
33d50 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
33d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
33d70 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33d80 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
33d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33da0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
33db0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
33dc0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
33dd0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
33de0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
33df0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
33e00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
33e10 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
33e20 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
33e30 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
33e40 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
33e50 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
33e60 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
33e70 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
33e80 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
33e90 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
33ea0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
33eb0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
33ec0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
33ed0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
33ee0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
33ef0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
33f00 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
33f10 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
33f20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
33f30 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
33f40 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
33f50 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
33f60 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
33f70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
33f80 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
33f90 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
33fa0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
33fb0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
33fc0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
33fd0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
33fe0 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
33ff0 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
34000 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
34010 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
34020 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
34030 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
34040 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
34050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34060 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
34070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34080 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34090 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
340a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
340b0 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74  ERROR );.  sqlit
340c0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
340d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
340e0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
340f0 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
34100 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
34110 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
34120 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
34130 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
34140 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
34150 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
34160 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
34170 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
34180 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
34190 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
341a0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
341b0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
341c0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
341d0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
341e0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
341f0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
34200 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34210 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
34220 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
34230 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
34240 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
34250 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
34260 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
34270 0a 20 20 20 20 20 20 70 61 67 65 72 52 65 6c 65  .      pagerRele
34280 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b  aseMapPage(pPg);
34290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
342a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
342b0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
342c0 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
342d0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
342e0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
342f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
34300 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
34310 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
34320 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
34330 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
34340 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
34350 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
34360 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
34370 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
34380 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
34390 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
343a0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
343b0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
343c0 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
343d0 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
343e0 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
343f0 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
34400 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
34410 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
34420 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
34430 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
34440 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
34450 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
34460 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
34470 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
34480 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
34490 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
344a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
344b0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
344c0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
344d0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
344e0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
344f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
34500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
34510 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
34520 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
34530 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
34540 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
34550 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
34560 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
34570 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
34580 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
34590 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
345a0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
345b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
345c0 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
345d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
345e0 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
345f0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
34600 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
34610 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
34620 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
34630 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
34640 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
34650 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
34660 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
34670 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
34680 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
34690 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
346a0 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
346b0 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
346c0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
346d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
346e0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
346f0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
34700 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
34710 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
34720 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
34730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34740 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
34750 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
34760 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
34770 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
34780 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
34790 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
347a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
347b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
347c0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
347d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
347e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
347f0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
34800 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
34810 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
34820 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
34830 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
34840 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
34850 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
34860 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
34870 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
34880 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
34890 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
348a0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
348b0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
348c0 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
348d0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
348e0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
348f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
34900 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
34910 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
34920 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
34930 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
34940 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
34950 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
34960 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
34970 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
34980 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
34990 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
349a0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
349b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
349c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OMEM;.    }.  . 
349d0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
349e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
349f0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
34a00 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
34a10 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
34a20 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
34a30 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
34a40 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
34a50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
34a60 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
34a70 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
34a80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
34a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34aa0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
34ab0 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
34ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
34ad0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
34ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
34af0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
34b00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
34b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
34b20 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
34b30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
34b40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
34b50 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
34b60 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
34b70 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
34b80 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
34b90 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
34ba0 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
34bb0 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66       );.  #ifdef
34bc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
34bd0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
34be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34bf0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
34c00 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
34c10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
34c20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
34c30 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
34c40 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
34c50 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20      );.  #else. 
34c60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34c70 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
34c80 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
34c90 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
34ca0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64  lags, 0);.  #end
34cb0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
34cc0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34cd0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
34ce0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
34cf0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
34d00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
34d10 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
34d20 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
34d30 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
34d40 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
34d50 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
34d60 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
34d70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
34d90 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
34da0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
34db0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
34dc0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
34dd0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
34de0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34df0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
34e00 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
34e10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
34e20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
34e30 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
34e40 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
34e50 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
34e60 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
34e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
34e80 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
34e90 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
34ea0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
34eb0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
34ec0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
34ed0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34ee0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
34ef0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
34f00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
34f10 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
34f20 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
34f30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34f40 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
34f50 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
34f60 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
34f70 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
34f80 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
34f90 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
34fa0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
34fb0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
34fc0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
34fd0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
34fe0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
34ff0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
35000 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
35010 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
35020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35030 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
35040 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
35050 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
35060 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
35070 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
35080 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
35090 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
350a0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
350b0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
350c0 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
350d0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
350e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
350f0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
35100 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
35110 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
35120 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
35130 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
35140 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
35150 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
35160 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35170 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
35180 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
35190 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
351a0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
351b0 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
351c0 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
351d0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
351e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
351f0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
35200 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
35210 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
35220 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
35230 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
35240 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
35250 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
35260 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
35270 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
35280 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
35290 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
352a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
352b0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
352c0 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
352d0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
352e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
352f0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
35300 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
35310 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
35320 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
35330 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35340 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
35350 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
35360 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
35370 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
35380 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
35390 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
353a0 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
353b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
353c0 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
353d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
353e0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
353f0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
35400 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
35410 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
35420 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
35430 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
35440 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
35450 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
35460 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
35470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35480 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
35490 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
354a0 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
354b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
354c0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
354d0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
354e0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
354f0 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
35500 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
35510 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
35520 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
35530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35550 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
35560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35570 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78      sqlite3WalEx
35580 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
35590 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
355a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
355b0 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
355c0 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
355d0 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
355e0 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
355f0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
35600 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
35610 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
35620 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
35630 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
35640 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
35650 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
35660 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
35670 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
35680 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
35690 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
356a0 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
356b0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
356c0 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
356d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
356e0 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
356f0 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
35700 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
35710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35720 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
35730 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
35740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35750 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
35760 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
35770 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
35780 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
35790 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
357a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
357b0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
357c0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
357d0 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
357e0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
357f0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
35800 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
35810 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
35820 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
35830 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
35840 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
35850 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
35860 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
35870 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35880 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61  LITE_OK && exFla
35890 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
358a0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
358b0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
358c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
358d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
358e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
358f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
35900 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f  hange to WRITER_
35910 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20  LOCKED state..  
35920 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
35930 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
35940 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41  ger.eState to PA
35950 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35960 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20  D or CACHEMOD.  
35970 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68      ** when it h
35980 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  as an open trans
35990 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
359a0 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49  r to DBMOD or FI
359b0 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a  NISHED..      **
359c0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
359d0 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73   in those states
359e0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
359f0 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  l back savepoint
35a00 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
35a10 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79  actions may copy
35a20 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
35a30 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ub-journal into 
35a40 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
35a50 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77      ** file as w
35a60 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20  ell as into the 
35a70 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63  page cache. Whic
35a80 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72  h would be incor
35a90 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a  rect in .      *
35aa0 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20  * WAL mode..    
35ab0 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
35ac0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
35ad0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b  R_WRITER_LOCKED;
35ae0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
35af0 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
35b00 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
35b10 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
35b20 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
35b30 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
35b40 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
35b50 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35b60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35b70 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
35b80 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
35b90 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
35ba0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
35bb0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
35bc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
35be0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
35bf0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
35c00 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65  CKED );.    asse
35c10 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35c20 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35c30 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
35c40 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
35c50 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
35c60 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65  (pPager)));.  re
35c70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35c80 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
35c90 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
35ca0 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
35cb0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
35cc0 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
35cd0 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
35ce0 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
35cf0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
35d00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
35d10 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
35d20 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
35d30 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
35d40 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
35d50 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
35d60 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
35d70 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
35d80 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
35d90 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
35da0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
35db0 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
35dc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
35dd0 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
35de0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
35df0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
35e00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
35e10 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
35e20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35e30 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  OK;..  /* This r
35e40 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
35e50 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72  lled unless a wr
35e60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35e70 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a  has already .  *
35e80 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20  * been started. 
35e90 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
35ea0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
35eb0 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20  be open at this 
35ec0 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69  point..  ** It i
35ed0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
35ee0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
35ef0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
35f00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35f10 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35f20 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
35f30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35f40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35f50 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
35f60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35f70 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
35f80 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
35f90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
35fa0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
35fb0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
35fc0 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69  r has been previ
35fd0 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20  ously detected, 
35fe0 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20  report the same 
35ff0 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e  error.  ** again
36000 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  . This should no
36010 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74 68  t happen, but th
36020 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65 73  e check provides
36030 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
36040 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36050 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20  er->errCode) )  
36060 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
36070 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69  rrCode;..  /* Hi
36080 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69  gher-level routi
36090 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74  nes never call t
360a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
360b0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a  database is not.
360c0 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20    ** writable.  
360d0 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79  But check anyway
360e0 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73  , just for robus
360f0 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20  tness. */.  if( 
36100 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65  NEVER(pPager->re
36110 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e  adOnly) ) return
36120 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20   SQLITE_PERM;.. 
36130 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
36140 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
36150 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
36160 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
36170 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
36180 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
36190 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
361a0 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
361b0 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
361c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
361d0 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
361e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
361f0 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
36200 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
36210 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
36220 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
36230 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
36240 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
36250 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
36260 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
36270 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
36280 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
36290 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
362a0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
362b0 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65  MakeDirty(), the
362c0 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
362d0 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20  might occur and 
362e0 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20  the pager would 
362f0 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52  end up in WRITER
36300 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20  _LOCKED state.  
36310 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61  ** with pages ma
36320 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e  rked as dirty in
36330 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f   the cache..  */
36340 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
36350 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36360 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
36370 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
36380 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
36390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
363a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
363b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
363c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
363d0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
363e0 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61  _CACHEMOD );.  a
363f0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36400 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36410 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  ) );..  /* Mark 
36420 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
36430 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
36440 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
36450 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
36460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
36470 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
36480 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
36490 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
364a0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
364b0 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
364c0 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62  nal(pPg) && !sub
364d0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
364e0 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  g) ){.    assert
364f0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
36500 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73  Pager) );.  }els
36510 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  e{.  .    /* The
36520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
36530 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
36540 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
36550 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
36560 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
36570 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
36580 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
36590 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
365a0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
365b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
365c0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
365d0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
365e0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
365f0 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61  f( !pageInJourna
36600 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65 72  l(pPg) && !pager
36610 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
36620 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36630 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
36640 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  er)==0 );.      
36650 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
36660 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36670 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
36680 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
36690 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
366a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
366b0 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34  ta2;.        i64
366c0 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
366d0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20  journalOff;..   
366e0 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
366f0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
36700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36710 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
36720 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
36730 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
36740 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
36750 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
36760 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
36770 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
36780 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
36790 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
367a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
367b0 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20  ager) );..      
367c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
367d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50  ->journalHdr<=pP
367e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
367f0 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
36800 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
36810 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
36820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
36830 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
36840 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
36850 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
36860 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
36870 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
36880 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
36890 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
368a0 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  rs while journal
368b0 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
368c0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
368d0 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
368e0 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
368f0 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
36900 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
36910 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
36920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
36930 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
36940 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
36950 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
36960 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
36970 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
36980 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
36990 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
369a0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
369b0 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
369c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
369d0 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
369e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
369f0 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
36a00 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
36a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d   */.        pPg-
36a20 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
36a30 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20  NEED_SYNC;..    
36a40 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
36a50 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
36a60 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  , iOff, pPg->pgn
36a70 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
36a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36a90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
36ab0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
36ac0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
36ad0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
36ae0 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69  ff+4);.        i
36af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36b00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36b10 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
36b20 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
36b30 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d  fd, iOff+pPager-
36b40 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73  >pageSize+4, cks
36b50 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  um);.        if(
36b60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
36b80 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
36b90 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
36ba0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
36bb0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
36bc0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
36bd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
36be0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
36bf0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
36c00 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
36c10 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
36c20 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
36c30 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
36c40 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
36c50 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
36c60 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
36c70 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
36c80 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
36ca0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
36cb0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
36cc0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
36cd0 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
36ce0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36cf0 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65  Off += 8 + pPage
36d00 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
36d10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
36d20 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
36d30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
36d40 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
36d50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36d60 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
36d70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
36d80 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
36d90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
36da0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
36db0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36dd0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
36de0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
36df0 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
36e00 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
36e10 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
36e20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
36e50 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
36e60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
36e70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
36e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36e90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
36ea0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
36eb0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
36ec0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
36ed0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
36ee0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
36ef0 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
36f00 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
36f10 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
36f20 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
36f30 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
36f40 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
36f50 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
36f60 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
36f70 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
36f80 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
36f90 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
36fa0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
36fb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
36fc0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
36fd0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
36fe0 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
36ff0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
37000 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
37010 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
37020 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
37030 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
37040 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
37050 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
37060 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
37070 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
37080 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
37090 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
370a0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
370b0 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
370c0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
370d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
370e0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
370f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
37100 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
37110 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
37120 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
37130 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
37140 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
37150 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
37160 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
37170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37180 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
37190 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
371a0 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  eable. This rout
371b0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
371c0 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61  ed before .** ma
371d0 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20  king changes to 
371e0 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c  a page. The call
371f0 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  er must check th
37200 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a  e return value .
37210 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ** of this funct
37220 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66  ion and be caref
37230 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65  ul not to change
37240 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
37250 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72  nless .** this r
37260 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
37270 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
37280 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
37290 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
372a0 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
372b0 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
372c0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
372d0 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
372e0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
372f0 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
37300 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
37310 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
37320 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
37330 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
37340 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
37350 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
37360 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
37370 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
37380 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
37390 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
373a0 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rs, SQLITE_NOMEM
373b0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
373c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
373d0 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61  .** as appropria
373e0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  te. Otherwise, S
373f0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
37400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37410 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
37420 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
37430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
37440 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
37450 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
37460 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
37470 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
37480 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
37490 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
374a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
374b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ;..  assert( (pP
374c0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
374d0 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a 20 20 61  _MMAP)==0 );.  a
374e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
374f0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
37500 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
37510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37520 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
37530 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
37540 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37550 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
37560 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65    if( nPagePerSe
37570 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
37580 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
37590 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
375a0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
375b0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
375c0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
375d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
375e0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
375f0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
37600 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
37610 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
37620 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
37630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37640 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
37650 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
37660 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
37670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37680 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
37690 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65  r */.    int nee
376a0 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  dSync = 0;      
376b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
376c0 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
376d0 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20  _NEED_SYNC */.. 
376e0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
376f0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61  NotSyncSpill fla
37700 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
37710 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
37720 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61  t allow.    ** a
37730 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
37740 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
37750 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
37760 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20  journaled by.   
37770 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
37780 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
37790 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
377a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
377b0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
377c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
377d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
377e0 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  ill++;..    /* T
377f0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
37800 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
37810 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
37820 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
37830 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
37840 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
37850 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
37860 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
37870 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
37880 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
37890 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
378a0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
378b0 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
378c0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
378d0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
378e0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50  1)) + 1;..    nP
378f0 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65  ageCount = pPage
37900 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69  r->dbSize;.    i
37910 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
37920 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
37930 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
37940 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
37950 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
37960 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
37970 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
37980 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
37990 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
379a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
379b0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
379c0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
379d0 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
379e0 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
379f0 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
37a00 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
37a10 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
37a20 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
37a30 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
37a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
37a50 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
37a60 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
37a70 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
37a80 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
37a90 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
37aa0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
37ab0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37ac0 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
37ad0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
37ae0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
37af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
37b00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
37b10 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
37b20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
37b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37b40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37b50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
37b60 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
37b70 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
37b80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
37b90 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
37ba0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
37bb0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
37bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
37bd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37be0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
37bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
37c00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
37c10 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
37c20 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
37c30 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
37c40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
37c50 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
37c60 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
37c70 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
37c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37c90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37ca0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
37cb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
37cc0 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
37cd0 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
37ce0 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
37cf0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
37d00 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
37d10 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
37d20 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
37d30 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
37d40 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
37d50 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
37d60 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
37d70 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
37d80 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
37d90 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
37da0 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
37db0 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
37dc0 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
37dd0 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
37de0 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
37df0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
37e00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
37e30 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
37e40 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
37e50 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  B );.      for(i
37e60 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69  i=0; ii<nPage; i
37e70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
37e80 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
37e90 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
37ea0 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
37eb0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
37ec0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
37ed0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37ee0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
37ef0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
37f00 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
37f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37f20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
37f30 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
37f40 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b  tSyncSpill==1 );
37f50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
37f60 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20  otSyncSpill--;. 
37f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
37f80 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
37f90 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
37fa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37fb0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
37fc0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
37fd0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
37fe0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
37ff0 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
38000 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
38010 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
38020 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
38030 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
38040 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
38050 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
38060 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
38070 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
38080 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
38090 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
380a0 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
380b0 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
380c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
380d0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
380e0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
380f0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
38100 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
38110 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
38120 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
38130 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
38140 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
38150 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
38160 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
38170 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
38180 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
38190 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
381a0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
381b0 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
381c0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
381d0 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
381e0 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
381f0 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
38200 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
38210 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
38220 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
38230 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
38240 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
38250 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
38260 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
38270 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
38280 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
38290 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
382a0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
382b0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
382c0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
382d0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
382e0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
382f0 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
38300 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
38310 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
38320 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
38330 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
38340 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
38350 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
38360 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
38370 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
38380 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
38390 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
383a0 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
383b0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
383c0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
383d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
383e0 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
383f0 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
38400 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
38410 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
38420 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
38430 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65  _WRITE;.    page
38440 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
38450 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Pg);.  }.}../*.*
38460 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
38470 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
38480 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
38490 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
384a0 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d  file .** change-
384b0 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20  counter, stored 
384c0 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d  as a 4-byte big-
384d0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73  endian integer s
384e0 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62  tarting at .** b
384f0 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66  yte offset 24 of
38500 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
38510 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72 79 20    The secondary 
38520 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
38530 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f 20  t.** 92 is also 
38540 75 70 64 61 74 65 64 2c 20 61 73 20 69 73 20 74  updated, as is t
38550 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  he SQLite versio
38560 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
38570 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  et 96..**.** But
38580 20 74 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   this only happe
38590 6e 73 20 69 66 20 74 68 65 20 70 50 61 67 65 72  ns if the pPager
385a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
385b0 65 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65 2e  e flag is false.
385c0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65 78 63  .** To avoid exc
385d0 65 73 73 20 63 68 75 72 6e 69 6e 67 20 6f 66 20  ess churning of 
385e0 70 61 67 65 20 31 2c 20 74 68 65 20 75 70 64 61  page 1, the upda
385f0 74 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  te only happens 
38600 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73  once..** See als
38610 6f 20 74 68 65 20 70 61 67 65 72 5f 77 72 69 74  o the pager_writ
38620 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
38630 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ) routine that d
38640 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e  oes an .** uncon
38650 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 20  ditional update 
38660 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  of the change co
38670 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  unters..**.** If
38680 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
38690 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  e flag is zero, 
386a0 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
386b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
386c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
386d0 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
386e0 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
386f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he co