/ Hex Artifact Content
Login

Artifact 76fe5ad6998772a6abda30145c181e99e7743a1d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
9cf0: 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20  en(p->fd) );.   
9d00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9d10: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9d20: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9d30: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9d40: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9d50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9d60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d70: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9d80: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9d90: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9da0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9db0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9dc0: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9dd0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9de0: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9df0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9e00: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9e10: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9e20: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9e30: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9e40: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9e50: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9e60: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9e70: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9e80: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9ea0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9eb0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9ec0: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9ed0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9ee0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9ef0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f10: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f30: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9f40: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9f50: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9f60: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9f70: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9f80: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f90: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9fa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fb0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fc0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fd0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9fe0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a000: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
a010: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
a020: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a030: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
a040: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a050: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a060: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a080: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a090: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a0a0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a0b0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a0c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a0d0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a0e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a110: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a130: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a140: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a150: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a160: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a170: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a180: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1a0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a1b0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a1c0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a1d0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a1e0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a1f0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a200: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a210: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a220: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a230: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a240: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a250: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a260: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a270: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a280: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a290: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a2a0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a2b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a2c0: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a2d0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a2e0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a2f0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a300: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a310: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a320: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a330: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a340: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a350: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a360: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a370: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a380: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a390: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a3a0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a3b0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a3c0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3d0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a3e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3f0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a400: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a410: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a420: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a440: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a450: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a480: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a490: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a4a0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a4b0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a4c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4d0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a4e0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a4f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a500: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a510: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a520: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a530: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a540: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a550: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a560: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a570: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a580: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a590: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a5a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a5b0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a5c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a5d0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a5e0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a5f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a600: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a610: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a620: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a640: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a650: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a660: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a670: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a680: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a690: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a6a0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a6b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a6c0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a6d0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a6e0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a6f0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a700: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a710: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a720: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a730: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a740: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a750: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a760: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a770: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a780: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a790: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a7a0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a7b0: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a7c0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a7d0: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a7e0: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a7f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a800: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a810: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a820: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a830: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a840: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a850: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a860: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a870: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a880: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a890: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a8a0: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
a8b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a8d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a8e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a8f0: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a900: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a910: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a920: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a930: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a940: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a950: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a960: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a970: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a980: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a990: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a9a0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a9b0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a9c0: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a9d0: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a9e0: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a9f0: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
aa00: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
aa10: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
aa20: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
aa30: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
aa40: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
aa50: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
aa60: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
aa70: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa80: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa90: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aaa0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aab0: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aac0: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aad0: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aae0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aaf0: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
ab00: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
ab10: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
ab20: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ab30: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
ab40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
ab50: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
ab60: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
ab70: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab80: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab90: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
aba0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
abb0: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
abc0: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
abd0: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
abe0: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
abf0: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ac00: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ac10: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
ac20: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
ac30: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
ac40: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
ac50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ac60: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
ac70: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac80: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac90: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
aca0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
acb0: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
acf0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ad20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
ad30: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
ad40: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ad50: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ad60: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
ad70: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad90: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ada0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
adb0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
adc0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
add0: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ade0: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
adf0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ae00: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ae10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ae20: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ae30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
ae50: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ae60: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
ae70: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae80: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae90: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
aea0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
aeb0: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
aec0: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
aed0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
aee0: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
aef0: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
af00: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
af10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
af30: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
af40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
af50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
af70: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afa0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
afb0: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
afc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
afd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afe0: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
aff0: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
b000: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b010: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b020: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
b030: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
b040: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b050: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b060: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
b070: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b080: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b090: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b0a0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b0b0: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b0c0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b0d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b0e0: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b0f0: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b100: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b110: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b120: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b130: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b140: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b150: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b160: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b170: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b180: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b190: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b1a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b1b0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b1c0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b1d0: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b1e0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b1f0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b200: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b210: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b220: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b230: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b240: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b250: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b270: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b280: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b290: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b2a0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b2b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b2c0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b2d0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b2e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b2f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b300: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b310: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b320: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b330: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b340: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b350: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b360: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b370: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b380: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b390: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b3a0: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b3b0: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b3c0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b3d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b3e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b3f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b400: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b410: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b420: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b430: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b440: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b450: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b460: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b470: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b480: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b490: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b4a0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b4b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b4c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b4d0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b4e0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b4f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b500: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b510: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b520: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b540: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b550: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b560: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b570: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b580: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b590: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b5a0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b5b0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b5c0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b5d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b5e0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b5f0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b600: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b610: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b620: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b630: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b640: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b660: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b670: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b680: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b690: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b6a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b6b0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b6c0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b6d0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b6e0: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b6f0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b700: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b710: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b720: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b730: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b740: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b750: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b760: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b770: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b780: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b790: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b7a0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b7b0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7c0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7d0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b7e0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b7f0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b800: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b810: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b820: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b830: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b850: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b860: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b870: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b880: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b890: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b8a0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b8b0: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b8c0: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b8d0: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b8e0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b8f0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b900: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b910: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b920: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b930: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b940: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b950: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b960: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b970: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b980: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b990: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b9a0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b9b0: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b9c0: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b9d0: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b9e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b9f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
ba00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ba10: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
ba20: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba30: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
ba40: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
ba50: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
ba60: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
ba70: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba90: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
baa0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bab0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
bac0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
bad0: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
bae0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
baf0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
bb00: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
bb10: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
bb20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bb30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bb40: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bb50: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bb60: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
bb70: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb80: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb90: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bba0: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bbb0: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bbe0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bbf0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bc00: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bc10: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bc20: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bc30: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bc40: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bc50: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bc60: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bc70: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc80: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc90: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bca0: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bcb0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bcc0: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bcd0: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bce0: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bcf0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bd00: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bd10: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bd20: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bd30: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bd40: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bd50: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bd60: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bd70: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd80: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bda0: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bdb0: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bdc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bde0: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bdf0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
be00: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
be10: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
be20: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
be30: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
be40: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
be50: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
be60: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
be70: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be80: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be90: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
bea0: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
bed0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
bee0: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
bef0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
bf00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
bf10: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bf20: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
bf30: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bf40: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bf50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bf60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bf70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf80: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf90: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bfa0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bfb0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bfc0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bfd0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bfe0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bff0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
c000: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c010: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
c020: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
c030: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
c040: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
c050: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
c060: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
c070: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c080: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c090: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c0a0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c0b0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c0c0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c0d0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c0e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c0f0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c100: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c110: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c120: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c130: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c140: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c150: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c160: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c180: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c190: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c1a0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c1b0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c1c0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c1d0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c1e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c1f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c200: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c210: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c220: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c240: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c250: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c260: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c270: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c280: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c290: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c2a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c2b0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c2e0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c2f0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c320: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c330: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c350: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c360: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c370: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c380: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c390: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c3a0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c3b0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c3c0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c3d0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c3e0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c3f0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c400: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c410: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c420: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c430: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c440: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c450: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c460: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c470: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c480: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c490: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c4a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c4b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c4c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c4d0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c4e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c4f0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c500: 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  e jrnlBufferSize
c510: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
c520: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c530: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c540: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c550: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c560: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c570: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c580: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c590: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c5a0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c5b0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c5c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c5d0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c5e0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c5f0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c600: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c610: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c620: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c630: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c640: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c650: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c660: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c670: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c680: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c690: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c6a0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c6b0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c6c0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c6d0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c6e0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c6f0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c700: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c710: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c720: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c730: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c740: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c750: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c760: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c770: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c780: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c7a0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c7b0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c7c0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c7d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c7e0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c7f0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c800: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c810: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c820: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c830: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c840: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c850: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c860: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c870: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c880: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c890: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c8a0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c8b0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c8c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c8d0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c8f0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c900: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c910: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c920: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c930: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c940: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c950: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c960: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c970: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c980: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c990: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c9a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c9b0: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c9c0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c9d0: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c9e0: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c9f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
ca00: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
ca10: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
ca20: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
ca30: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
ca40: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
ca50: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
ca60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ca70: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
ca80: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
ca90: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
caa0: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
cab0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
cac0: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
cad0: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cae0: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
caf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cb00: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cb10: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
cb20: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cb30: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cb40: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cb50: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cb60: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cb70: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cb80: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cb90: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cba0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cbb0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cbc0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cbd0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cbe0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cbf0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
cc00: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
cc10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cc20: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cc30: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
cc40: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cc50: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cc60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cc70: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cc80: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cc90: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cca0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
ccb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
ccc0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
ccd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cce0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
ccf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cd00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cd10: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cd20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cd30: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cd40: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
cd50: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
cd60: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
cd70: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
cd80: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
cd90: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
cda0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
cdb0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
cdc0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
cdd0: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
cde0: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cdf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ce00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
ce10: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
ce20: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
ce30: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
ce40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ce50: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
ce60: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
ce70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
ce80: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
ce90: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cea0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ceb0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cec0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
ced0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cee0: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cef0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cf20: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
cf50: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
cf60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cf70: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf90: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
cfa0: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
cfb0: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
cfc0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
cfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
cfe0: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
cff0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d000: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d030: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d050: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d060: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d070: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d080: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d090: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d0c0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d0d0: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d0e0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d0f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d100: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d110: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d120: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d130: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d140: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d150: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d160: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d170: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d180: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d190: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d1a0: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d1b0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d1c0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d1d0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d1e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d1f0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d200: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d210: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d240: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d250: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d260: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d270: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d280: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d290: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d2a0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d2b0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d2c0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d2d0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d2e0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d2f0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d300: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d310: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d320: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d330: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d340: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d350: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d360: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d380: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d390: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d3c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d3d0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d3e0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d400: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d410: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d420: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d430: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d450: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d460: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d470: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d480: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d490: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d4a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d4b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d4c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d4d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d4e0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d4f0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d590: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d5a0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d5b0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d5c0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d5d0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d5e0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d5f0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d600: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d610: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d620: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d630: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d640: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d660: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d670: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d680: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d690: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d6a0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d6b0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d6c0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d6d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d6e0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d700: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d710: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d720: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d730: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d740: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d750: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d760: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d770: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d780: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d790: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d7a0: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d7b0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d7d0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d7e0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d7f0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d800: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d810: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d820: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d830: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d840: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d850: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d860: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d870: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d880: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d890: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d8a0: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d8b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d8c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d8d0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d8e0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d8f0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d900: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d910: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d920: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d930: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d940: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d950: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d960: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d970: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d980: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d990: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d9a0: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d9b0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d9c0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d9d0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d9e0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
da00: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
da10: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
da20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
da30: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
da40: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
da50: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
da60: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
da70: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
da80: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
da90: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
daa0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
dab0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
dac0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
dad0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
dae0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
daf0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
db00: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
db10: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
db20: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
db50: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
db60: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
db70: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
db80: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
db90: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
dba0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dbb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dbc0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dbd0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dbe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dbf0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
dc00: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
dc10: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
dc20: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dc30: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dc40: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
dc50: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dc60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dc70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dc90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dca0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
dcb0: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
dcc0: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
dcd0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
dce0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dcf0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
dd00: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
dd10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd20: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dd30: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
dd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dd50: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
dd60: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
dd70: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
dd80: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
dd90: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
dda0: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
ddb0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
ddc0: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
ddd0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
dde0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
ddf0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
de00: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
de10: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
de20: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
de30: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
de40: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
de50: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
de60: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
de70: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
de80: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
de90: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
dea0: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
deb0: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
dec0: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
ded0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dee0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
def0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
df00: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
df10: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
df20: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
df30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
df40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
df50: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
df60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df70: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
df80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df90: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dfa0: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dfe0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dff0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e000: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e010: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e020: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e030: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e040: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e050: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e060: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e070: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e080: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e090: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e0a0: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e0b0: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e0c0: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e0d0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e0e0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e0f0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e100: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e110: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e120: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e130: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e140: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e150: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e160: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e170: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e180: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e190: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e1a0: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e1b0: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e1c0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e1d0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e1e0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e1f0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e200: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e210: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e220: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e230: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e240: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e250: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e260: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e290: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e2a0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e2b0: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e2c0: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e2d0: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e2e0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e2f0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e300: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e310: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e320: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e330: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e340: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e360: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e370: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e380: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e3b0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e3c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3d0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e3e0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e3f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e400: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e410: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e420: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e430: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e440: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e450: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e460: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e470: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e480: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e490: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e4a0: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e4b0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e4c0: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e4d0: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e4e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e4f0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e500: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e510: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e520: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e530: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e540: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e550: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e560: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e570: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e580: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e590: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e5a0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e5c0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e5d0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e5e0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e5f0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e600: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e610: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e620: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e630: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e640: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e650: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e660: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e670: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e680: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e690: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e6a0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e6b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e6c0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e6d0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e6e0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e6f0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e700: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e710: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e720: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e730: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e740: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e750: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e760: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e770: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e780: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e790: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e7a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e7b0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e7c0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e7d0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e7e0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e7f0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e800: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e810: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e820: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e830: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e840: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e850: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e870: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e880: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e890: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e8a0: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e8b0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e8c0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e8d0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e8e0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e8f0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e900: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e910: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e920: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e930: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e940: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e950: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e960: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e970: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e980: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e990: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e9a0: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e9b0: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e9c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e9d0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e9e0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e9f0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ea00: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ea10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ea20: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ea30: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ea40: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ea50: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ea60: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ea70: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ea80: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ea90: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
eaa0: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
eab0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
eac0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ead0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eae0: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eaf0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
eb00: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
eb10: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
eb20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
eb30: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
eb40: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
eb50: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
eb60: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
eb70: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
eb80: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
eb90: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
eba0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ebb0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ebc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ebd0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ebe0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ebf0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ec00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ec10: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ec20: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ec30: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
ec40: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ec50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec60: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ec70: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ec80: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ec90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
eca0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ecb0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ecc0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ecd0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ece0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
ecf0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
ed00: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
ed10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ed20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed30: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
ed40: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ed50: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ed60: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ed70: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ed80: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ed90: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
eda0: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
edb0: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
edc0: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
edd0: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ede0: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
edf0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ee00: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ee10: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
ee20: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
ee30: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
ee40: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ee50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ee60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ee70: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
ee80: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
ee90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eea0: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eeb0: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eec0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eed0: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eee0: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eef0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
ef00: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
ef10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
ef20: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ef30: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ef40: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ef50: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ef60: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ef70: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ef80: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ef90: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
efa0: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
efb0: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
efc0: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
efd0: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
efe0: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
eff0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f000: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f010: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f020: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f030: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f040: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f050: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f060: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f070: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f080: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f090: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f0a0: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f0b0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f0c0: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f0d0: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f0e0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f0f0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f100: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f110: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f120: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f130: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f140: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f150: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f160: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f170: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f180: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f190: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f1a0: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f1b0: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f1c0: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f1d0: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f1e0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f1f0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f200: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f210: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f220: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f230: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f240: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f250: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f260: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f270: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f280: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f290: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f2a0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f2b0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f2c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f2d0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f2f0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f300: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f310: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f320: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f330: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f340: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f360: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f370: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f380: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f390: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f3a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f3c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f3d0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f3e0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f3f0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f400: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f410: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f420: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f430: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f440: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f450: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f460: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f470: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f480: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f490: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f4a0: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f4b0: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f4c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f4d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4e0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f4f0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f500: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f510: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f520: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f530: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f540: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f550: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f560: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f570: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f580: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f590: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f5a0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f5b0: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f5c0: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f5d0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f5e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f5f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f600: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f610: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f620: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f630: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f640: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f650: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f660: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f670: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f680: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f690: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f6a0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f6b0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f6c0: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f6d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f6e0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f6f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f700: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f710: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f720: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f740: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f750: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f760: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f780: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f790: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f7a0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f7b0: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f7d0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f7e0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f7f0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f810: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f820: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f830: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f840: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f870: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f880: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f890: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f8a0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f8b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f8c0: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f8e0: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f8f0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f900: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f910: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f920: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f930: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f940: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f950: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f960: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f970: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f980: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f990: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f9a0: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f9b0: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f9c0: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f9d0: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f9e0: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f9f0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fa00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa10: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fa20: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fa30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fa40: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fa50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fa60: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fa70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa80: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fa90: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
faa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fab0: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fac0: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fad0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fae0: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
faf0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fb00: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fb10: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fb20: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fb30: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fb40: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fb50: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fb60: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fb70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fb80: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fb90: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fba0: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fbb0: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fbc0: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fbd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fbe0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fbf0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fc00: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fc10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fc20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fc30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc40: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fc50: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fc60: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fc70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fc80: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fc90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fca0: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fcb0: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fcc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcd0: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fce0: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fcf0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
fd00: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fd10: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fd20: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fd30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd40: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fd50: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
fd60: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
fd70: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fd80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fda0: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fdb0: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fdc0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdd0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fde0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fdf0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fe00: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fe10: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fe20: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe30: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fe40: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fe60: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
fe70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fe80: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fe90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fea0: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
feb0: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fec0: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fed0: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fef0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
ff00: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ff10: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
ff20: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
ff30: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
ff40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
ff50: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
ff60: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
ff70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff90: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
ffa0: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
ffb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffc0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffd0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffe0: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fff0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10010 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
10020 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
10030 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
10040 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10050 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10060 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10070 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10080 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10090 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
100a0 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
100b0 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
100c0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
100d0 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
100e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
100f0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10100 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
10110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10130 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
10140 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10150 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10160 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10170 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10180 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10190 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
101a0 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
101b0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
101c0 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
101d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
101e0 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
101f0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10200 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
10210 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
10220 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
10230 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
10240 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10250 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10260 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10270 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10280 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10290 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
102a0 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
102b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
102c0 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
102d0 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
102e0 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
102f0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10300 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10310 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10320 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10330 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
10340 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10350 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10360 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10370 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10380 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10390 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
103a0 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
103b0 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
103c0 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
103d0 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
103e0 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
103f0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10410 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10430 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10440 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10450 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10460 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10470 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10480 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10490 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
104a0 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
104b0 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
104c0 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
104d0 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
104e0 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
104f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10510 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10520 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10530 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10540 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10550 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10560 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10570 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10580 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10590 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
105a0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
105b0 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
105c0 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
105d0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
105e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
105f0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10600 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10610 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10620 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10630 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10640 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10650 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10660 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10670 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10680 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10690 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
106a0 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
106b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
106c0 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
106d0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
106e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
106f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10700 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10710 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10720 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10730 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10740 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10750 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10760 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10770 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10780 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10790 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
107a0 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
107b0 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
107c0 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
107d0 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
107e0 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
107f0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10810 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
10820 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10830 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10840 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10850 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10860 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10870 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10880 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10890 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
108a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108b0 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
108c0 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
108d0 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
108e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108f0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10900 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10910 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10920 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10930 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10940 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10950 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10960 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10970 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10980 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10990 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
109a0 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
109b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
109c0 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
109d0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
109e0 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
109f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10a00 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10a10 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10a20 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10a30 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10a40 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10a50 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10a70 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10aa0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10ad0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10ae0 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10b10 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10b20 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10b50 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10b60 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10b70 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10b90 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10ba0 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10bb0 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10be0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10c00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10c20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10c30 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10c40 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10c50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10c60 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10c70 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10c80 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10c90 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10cb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10cc0 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10cf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d00 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10d10 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10d20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10d30 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10d40 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10d50 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10d60 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10d70 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10d80 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10d90 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10da0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10db0 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10dc0 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10dd0 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10de0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10df0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10e00 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10e10 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10e20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10e30 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10e40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10e50 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10e60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10e70 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10e90 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10ea0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10eb0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10ed0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10ef0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10f00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10f10 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10f20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10f30 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10f40 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10f60 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10f70 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10f80 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10f90 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10fa0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10fb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10fc0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10fd0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10fe0 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10ff0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11000 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11010 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11020 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
11030 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
11040 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11050 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11060 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11070 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11080 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
110a0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
110b0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
110c0 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
110f0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11110 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11120 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11130 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
11140 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11150 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11160 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11170 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11180 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11190 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
111a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
111b0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111c0 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
111d0 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
111e0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
111f0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11200 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11210 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11220 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11230 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
11240 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11250 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11260 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11270 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11280 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11290 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
112a0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
112b0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
112c0 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
112d0 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
112e0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
112f0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11300 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11310 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11320 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11330 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11340 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11350 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11360 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11370 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11380 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11390 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
113a0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
113b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
113c0 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
113d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
113e0 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
113f0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11400 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11410 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11420 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11430 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11440 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11450 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11460 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11470 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11480 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11490 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
114a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
114b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
114c0 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
114d0 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
114e0 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
114f0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11500 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11520 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11530 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11540 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11550 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11560 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11570 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11580 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11590 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
115a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
115b0 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
115c0 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
115d0 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
115e0 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
115f0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11600 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11610 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11630 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11640 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11650 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11670 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11680 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11690 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
116a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
116b0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
116c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
116d0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
116e0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
116f0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11700 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11710 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11720 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11730 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
11740 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11750 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11760 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11770 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11780 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11790 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
117a0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
117b0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
117c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
117d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
117e0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
117f0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11800 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11810 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11820 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11830 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11840 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11850 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11860 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11870 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11880 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11890 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
118b0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
118c0 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
118d0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
118e0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
118f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11900 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11920 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11930 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11940 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11950 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11960 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11970 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11980 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11990 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
119a0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
119b0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
119c0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
119d0 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
119e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
119f0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11a00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11a20 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11a30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11a40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11a70 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11a80 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11a90 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11aa0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11ab0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11ac0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11ad0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
11ae0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11af0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11b00 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11b10 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11b20 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11b30 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11b40 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11b50 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11b60 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11b70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11b80 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11b90 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11ba0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11bb0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11bc0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11bd0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
11be0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11bf0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11c00 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11c20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11c40 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11c50 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11c60 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11c70 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11c80 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11c90 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11ca0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11cb0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11cc0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11cd0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
11ce0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11cf0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11d00 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11d10 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11d20 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11d30 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11d40 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11d50 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11d60 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11d70 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11d80 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11d90 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11da0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11db0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11dc0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11dd0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11de0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11df0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11e00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e10 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11e20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11e30 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11e40 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11e50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11e60 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11e70 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11e80 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
11e90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11eb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11ec0 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
11ed0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
11ee0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11ef0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11f00 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11f10 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11f20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11f30 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11f40 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11f70 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11f80 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
11f90 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
11fa0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
11fb0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11fc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
11fd0 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
11fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11ff0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
12000 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
12010 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
12020 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
12030 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12040 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
12050 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
12060 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
12070 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
12080 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
12090 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
120a0 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
120b0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
120c0 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
120d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
120e0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120f0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
12100 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12110 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12120 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
12130 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12140 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12150 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
12160 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12170 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12180 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
12190 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
121a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
121b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
121c0 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
121d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
121e0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
121f0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
12200 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
12210 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
12220 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
12230 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
12240 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
12250 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
12260 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
12270 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12280 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
12290 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
122a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
122b0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
122c0 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
122d0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
122e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
122f0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
12300 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
12310 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
12320 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
12330 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12340 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12350 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12360 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12370 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12380 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
123a0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
123b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
123c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
123d0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
123e0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
123f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12400 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
12410 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
12420 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
12430 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12440 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12450 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12460 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12470 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12480 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12490 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
124a0 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
124b0 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
124c0 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
124d0 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
124e0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
124f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12500 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12510 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
12520 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
12530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12540 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12550 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12560 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12570 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12580 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12590 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
125a0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
125b0 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
125c0 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
125d0 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
125e0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
125f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12600 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12610 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12620 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12630 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12640 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12650 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12660 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12670 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12690 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
126a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
126b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
126c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
126d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
126e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  e==0 ){.      pa
126f0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12700 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
12710 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12720 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
12730 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12740 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ER_OPEN;.    }el
12750 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12760 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70  ->eState = (isOp
12770 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12780 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50  ? PAGER_OPEN : P
12790 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20  AGER_READER);.  
127a0 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46    }.    if( USEF
127b0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
127c0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
127d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
127e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
127f0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
12800 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  OK;.  }..  pPage
12810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12820 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
12830 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
12840 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
12850 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
12860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12870 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
12880 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12890 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
128a0 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
128b0 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
128c0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
128d0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
128e0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
128f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
12900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12910 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12920 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
12930 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
12940 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
12950 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
12960 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
12970 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
12980 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12990 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
129a0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
129b0 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
129c0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
129d0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
129e0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
129f0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12a00 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12a10 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12a20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
12a30 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
12a40 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
12a50 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
12a60 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
12a70 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
12a80 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12a90 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12aa0 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12ab0 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12ac0 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12ad0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12ae0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12af0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12b00 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12b10 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12b20 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
12b30 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
12b40 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
12b50 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
12b60 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
12b70 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
12b80 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b90 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12ba0 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12bb0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12bc0 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12bd0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12be0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12bf0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12c00 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12c10 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12c20 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12c30 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12c40 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12c50 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12c60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12c70 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12c80 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12c90 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12ca0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12cc0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12cd0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12ce0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12cf0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12d00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12d20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12d30 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12d50 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12d60 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12d70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12d90 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12da0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12db0 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12de0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12df0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12e00 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12e10 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
12e20 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ion open on the 
12e30 70 61 67 65 72 20 70 61 73 73 65 64 20 61 73 20  pager passed as 
12e40 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
12e50 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 63 6f  t is.** being co
12e60 6d 6d 69 74 74 65 64 2e 20 54 68 69 73 20 66 75  mmitted. This fu
12e70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
12e80 72 75 65 20 69 66 20 61 6c 6c 20 64 69 72 74 79  rue if all dirty
12e90 20 70 61 67 65 73 20 73 68 6f 75 6c 64 0a 2a 2a   pages should.**
12ea0 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
12eb0 69 73 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  isk, or false ot
12ec0 68 65 72 77 69 73 65 2e 20 50 61 67 65 73 20 73  herwise. Pages s
12ed0 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64  hould be flushed
12ee0 20 74 6f 20 64 69 73 6b 0a 2a 2a 20 75 6e 6c 65   to disk.** unle
12ef0 73 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ss one of the fo
12f00 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
12f10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
12f20 62 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  b is an in-memor
12f30 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
12f40 2a 20 20 20 2a 20 54 68 65 20 64 62 20 69 73 20  *   * The db is 
12f50 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
12f60 62 61 73 65 20 61 6e 64 20 74 68 65 20 64 62 20  base and the db 
12f70 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
12f80 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  n opened..**.** 
12f90 20 20 2a 20 54 68 65 20 64 62 20 69 73 20 61 20    * The db is a 
12fa0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12fb0 73 65 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  se and the cache
12fc0 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73 20 74   contains less t
12fd0 68 61 6e 0a 2a 2a 20 20 20 20 20 43 2f 34 20 64  han.**     C/4 d
12fe0 69 72 74 79 20 70 61 67 65 73 2c 20 77 68 65 72  irty pages, wher
12ff0 65 20 43 20 69 73 20 74 68 65 20 63 6f 6e 66 69  e C is the confi
13000 67 75 72 65 64 20 63 61 63 68 65 2d 73 69 7a 65  gured cache-size
13010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13020 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
13030 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
13040 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
13050 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
13060 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
13070 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
13080 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
13090 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
130a0 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72  PCachePercentDir
130b0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
130c0 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a  he)>=25);.}../*.
130d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
130e0 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
130f0 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
13100 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
13110 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
13120 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
13130 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
13140 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
13150 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
13160 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
13170 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
13180 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
13190 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
131a0 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
131b0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
131c0 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
131d0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
131e0 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
131f0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13200 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
13210 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13220 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
13230 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
13240 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
13250 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
13260 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
13270 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
13280 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
13290 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
132a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
132b0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
132c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
132d0 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
132e0 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
132f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
13300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13310 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
13320 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
13330 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
13340 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
13350 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
13360 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
13370 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
13380 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
13390 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
133a0 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
133b0 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
133c0 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
133d0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
133e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
133f0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
13400 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13410 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
13420 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13430 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13440 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13450 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13460 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13470 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13480 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13490 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
134a0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
134b0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
134c0 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
134d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
134e0 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
134f0 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
13500 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
13510 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
13520 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13530 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13540 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13550 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13560 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13570 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13580 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13590 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
135a0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
135b0 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
135c0 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
135d0 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
135e0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
135f0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
13600 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
13610 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
13620 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13630 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13640 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13650 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13660 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13670 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13680 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13690 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
136a0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
136b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
136c0 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
136d0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
136e0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
136f0 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
13700 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
13710 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
13720 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13730 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13740 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13750 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13760 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13770 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
13780 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
13790 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
137a0 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
137b0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
137c0 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
137d0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
137e0 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
137f0 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
13800 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
13810 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
13820 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
13830 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
13840 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
13850 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
13860 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
13870 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
13880 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
13890 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
138a0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
138b0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
138c0 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
138d0 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
138e0 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
138f0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13900 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
13910 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
13920 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
13930 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13940 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
13950 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
13960 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
13970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13980 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
13990 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
139a0 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
139b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
139c0 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
139d0 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
139e0 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
139f0 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
13a00 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
13a10 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
13a20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
13a30 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
13a40 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
13a50 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13a60 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
13a70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
13a80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
13a90 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
13aa0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13ab0 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
13ac0 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
13ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13ae0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13af0 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13b00 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13b10 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13b20 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13b30 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13b40 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13b50 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13b60 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13b70 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
13b80 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13b90 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
13ba0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
13bb0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
13bc0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
13bd0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13be0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13bf0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13c00 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13c10 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13c20 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13c30 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13c40 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13c50 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13c60 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13c70 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
13c80 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
13c90 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
13ca0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
13cb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
13cc0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
13cd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13ce0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13d00 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13d10 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13d20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13d30 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13d40 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13d50 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13d60 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13d70 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
13d80 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13d90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13da0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
13db0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
13dc0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
13dd0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13de0 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13df0 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13e00 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13e10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13e20 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13e30 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13e40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13e50 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13e60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13e70 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
13e80 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
13e90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
13ea0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
13eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13ec0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
13ed0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13ee0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13ef0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13f00 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13f10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13f20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13f30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13f50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13f60 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13f70 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13f80 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
13f90 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
13fa0 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
13fb0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13fc0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
13fd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13fe0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ff0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f  ODE_MEMORY ); */
14000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14010 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
14020 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
14030 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14040 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14050 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
14060 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
14070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14080 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
14090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
140a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
140b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140c0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
140d0 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
140e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
140f0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
14100 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14110 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
14120 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
14130 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
14140 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
14150 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
14160 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
14170 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
14180 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
14190 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
141a0 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
141b0 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
141c0 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
141d0 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
141e0 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
141f0 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
14200 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
14210 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
14220 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
14230 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
14240 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
14250 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
14260 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
14270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14280 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14290 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
142a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
142b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
142c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
142d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
142e0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
142f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14300 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
14310 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
14320 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14330 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14340 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14350 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14360 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  r||pPager->tempF
14370 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ile);.      pPag
14380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14390 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
143a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
143b0 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
143c0 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
143d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
143e0 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
143f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14400 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14410 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
14420 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14430 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
14440 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
14450 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
14460 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
14470 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14490 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
144a0 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
144b0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
144c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
144d0 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
144e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
144f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14500 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14510 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
14520 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14530 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14540 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14550 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
14560 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14580 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14590 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
145a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
145b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
145c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
145d0 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
145e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
145f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14600 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14610 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
14620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14630 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
14640 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
14650 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
14660 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
14670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14680 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14690 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
146a0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
146b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
146c0 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
146d0 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
146e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
146f0 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14700 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14710 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
14720 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
14730 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
14740 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
14750 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
14760 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
14770 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14780 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14790 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
147a0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
147b0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
147c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
147d0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
147e0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
147f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14800 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
14810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14820 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d   pagerFlushOnCom
14830 6d 69 74 28 70 50 61 67 65 72 29 20 29 7b 0a 20  mit(pPager) ){. 
14840 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
14850 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
14860 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
14870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
14880 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
14890 57 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d  Writable(pPager-
148a0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d  >pPCache);.    }
148b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
148c0 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
148d0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
148e0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
148f0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
14900 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
14910 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
14920 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
14930 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
14940 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
14950 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
14960 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
14970 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
14980 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
14990 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
149a0 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
149b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
149c0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
149d0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
149e0 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
149f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
14a00 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
14a10 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
14a20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
14a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14a40 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65  bCommit && pPage
14a50 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50  r->dbFileSize>pP
14a60 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
14a70 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14a80 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
14a90 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
14aa0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c  ansaction in rol
14ab0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20  lback-journal.  
14ac0 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65    ** mode if the
14ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
14ae0 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72  n disk is larger
14af0 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
14b00 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
14b10 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
14b20 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
14b30 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
14b40 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
14b50 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  n .    ** succes
14b60 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64  sfully committed
14b70 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53  , but the EXCLUS
14b80 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c  IVE lock is stil
14b90 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  l held on the.  
14ba0 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74    ** file. So it
14bb0 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e   is safe to trun
14bc0 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
14bd0 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69  e file to its mi
14be0 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71  nimum.    ** req
14bf0 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a  uired size.  */.
14c00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14c10 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
14c20 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
14c30 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
14c40 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
14c50 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
14c60 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
14c70 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
14c80 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  t && isOpen(pPag
14c90 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
14ca0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14cb0 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
14cc0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
14cd0 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57  L_COMMIT_PHASETW
14ce0 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  O, 0);.    if( r
14cf0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14d00 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14d10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
14d20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14d30 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
14d40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14d50 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
14d60 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
14d70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
14d80 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
14d90 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
14da0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
14db0 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
14dc0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
14dd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
14de0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
14df0 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
14e00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
14e10 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
14e20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
14e30 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
14e40 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
14e50 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
14e60 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
14e70 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
14e80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
14e90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14ea0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
14eb0 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14ec0 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
14ed0 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
14ee0 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
14ef0 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
14f00 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
14f10 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
14f20 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14f30 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
14f40 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
14f50 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
14f60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14f70 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
14f80 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
14f90 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
14fa0 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
14fb0 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
14fc0 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
14fd0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
14fe0 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
14ff0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
15000 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
15010 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
15020 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
15030 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
15040 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
15050 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15060 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
15070 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
15080 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
15090 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
150a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
150b0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
150c0 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
150d0 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
150e0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
150f0 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
15100 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
15110 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
15120 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15130 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
15140 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
15150 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15160 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
15170 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
15180 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15190 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
151a0 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
151b0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
151c0 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
151d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
151e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
151f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
15200 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
15210 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
15220 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15230 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
15240 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
15250 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
15260 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15270 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15280 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
15290 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
152a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
152b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
152c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
152d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
152e0 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
152f0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15300 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
15310 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
15320 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
15330 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
15340 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
15350 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
15360 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15370 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15380 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
15390 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
153a0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
153b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
153c0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
153d0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
153e0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
153f0 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
15400 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
15410 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
15420 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
15430 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
15440 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
15450 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
15460 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
15470 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15480 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15490 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
154a0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
154b0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
154c0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
154d0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
154e0 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
154f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
15500 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
15510 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
15520 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
15530 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
15540 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
15550 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
15560 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
15570 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15580 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15590 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
155a0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
155b0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
155c0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
155d0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
155e0 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
155f0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
15600 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
15610 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
15620 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
15630 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
15640 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
15650 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
15660 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
15670 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15680 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15690 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
156a0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
156b0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
156c0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
156d0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
156e0 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
156f0 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
15700 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
15710 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
15720 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
15730 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
15740 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
15750 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
15760 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
15770 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15780 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15790 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
157a0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
157b0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
157c0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
157d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
157e0 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
157f0 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
15800 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
15810 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15820 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
15830 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
15840 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
15850 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
15860 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
15870 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15880 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15890 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
158a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
158b0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
158c0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
158d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15900 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15910 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
15920 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
15930 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
15940 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
15950 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
15960 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
15970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15980 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61  S_CODEC./*.** Ma
15990 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
159a0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
159b0 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  its is the same 
159c0 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
159d0 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69  on.** pager as i
159e0 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72  t is in the sour
159f0 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20  ce.  This comes 
15a00 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d  up when a VACUUM
15a10 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20   changes the.** 
15a20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
15a30 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22  ed bits to the "
15a40 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e  optimal" amount.
15a50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15a60 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76  PagerAlignReserv
15a70 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20  e(Pager *pDest, 
15a80 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20  Pager *pSrc){.  
15a90 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65  if( pDest->nRese
15aa0 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65  rve!=pSrc->nRese
15ab0 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74  rve ){.    pDest
15ac0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72  ->nReserve = pSr
15ad0 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  c->nReserve;.   
15ae0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15af0 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  (pDest);.  }.}.#
15b00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
15b10 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
15b20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
15b30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
15b40 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
15b50 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
15b60 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
15b70 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
15b80 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
15b90 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
15ba0 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
15bb0 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
15bc0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
15bd0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15be0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15bf0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15c00 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
15c10 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
15c20 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
15c30 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
15c40 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
15c50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15c60 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
15c70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15c80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
15c90 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
15ca0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15cb0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
15cc0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15cd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15ce0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15cf0 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15d00 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
15d10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
15d20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15d30 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
15d40 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
15d50 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
15d60 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
15d70 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
15d80 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
15d90 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
15da0 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
15db0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15dc0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
15dd0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
15de0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
15df0 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
15e00 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
15e10 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
15e20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
15e30 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
15e40 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
15e50 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
15e60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15e70 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
15e80 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
15e90 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15ea0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
15eb0 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
15ec0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
15ed0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
15ee0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
15ef0 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
15f00 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
15f10 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15f20 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
15f30 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
15f40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f50 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
15f60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15f70 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
15f80 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15f90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15fa0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15fb0 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
15fc0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
15fd0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15fe0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15ff0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
16000 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
16010 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
16020 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
16030 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
16040 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
16050 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
16060 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
16070 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
16080 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
16090 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
160a0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
160b0 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
160c0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
160d0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
160e0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
160f0 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
16100 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
16110 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
16120 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
16130 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
16140 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
16150 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16160 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
16170 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
16180 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
16190 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
161a0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
161b0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
161c0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
161d0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
161e0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
161f0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
16200 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
16210 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
16220 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16240 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
16250 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
16260 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16280 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
16290 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
162a0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
162b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
162c0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
162d0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
162e0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
162f0 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
16300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16310 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
16320 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
16330 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
16340 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
16350 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
16360 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
16370 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
16380 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
16390 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
163a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
163b0 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
163c0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
163d0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
163e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
163f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16400 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
16410 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
16420 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
16430 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
16440 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
16450 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
16460 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16480 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
16490 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
164a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
164b0 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
164c0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
164d0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
164e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
164f0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
16500 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16510 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
16520 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
16530 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
16540 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
16550 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
16560 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
16570 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16580 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16590 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
165a0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
165b0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
165c0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
165d0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
165e0 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
165f0 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
16600 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
16610 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
16620 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
16630 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
16640 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
16650 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
16660 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
16670 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
16680 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
16690 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
166a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
166b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
166c0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
166d0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
166e0 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
166f0 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
16700 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
16710 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
16720 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
16730 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
16740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
16750 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
16760 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
16770 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
16780 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
16790 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
167a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
167b0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
167c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
167d0 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
167e0 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
167f0 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16800 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16810 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
16820 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
16830 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
16840 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
16850 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
16860 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
16870 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16880 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
16890 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
168a0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
168b0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
168c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
168d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
168e0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
168f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16900 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16910 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
16920 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
16930 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16940 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
16950 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
16960 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
16970 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
16980 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
16990 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
169a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
169b0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
169c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
169d0 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
169e0 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
169f0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16a00 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
16a10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16a20 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16a30 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
16a40 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
16a50 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
16a60 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
16a70 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
16a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
16aa0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
16ab0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
16ac0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
16ad0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16ae0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16af0 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16b00 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
16b10 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
16b20 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
16b30 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
16b40 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
16b50 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
16b60 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
16b70 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
16b80 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
16b90 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16ba0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
16bb0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
16bc0 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
16bd0 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16be0 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16bf0 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16c00 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
16c10 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
16c20 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
16c30 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
16c40 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
16c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16c60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
16c70 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
16c80 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
16c90 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
16ca0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
16cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16cc0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
16cd0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16ce0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16cf0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16d00 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
16d10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16d20 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
16d30 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
16d40 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
16d50 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
16d60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16d70 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
16d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16d90 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
16da0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16db0 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
16dc0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
16dd0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
16de0 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
16df0 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
16e00 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
16e10 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
16e20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
16e30 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
16e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16e60 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
16e70 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
16e80 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
16e90 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
16ea0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
16eb0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
16ec0 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
16ed0 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
16ee0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
16ef0 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
16f00 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
16f10 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
16f20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16f30 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
16f40 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
16f50 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
16f60 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
16f70 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
16f80 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
16f90 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
16fa0 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
16fb0 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
16fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16fd0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
16fe0 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
16ff0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
17000 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
17010 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
17020 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
17030 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
17040 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
17050 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
17060 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
17070 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17080 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
17090 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
170a0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
170b0 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
170c0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
170d0 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
170e0 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
170f0 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
17100 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
17110 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
17120 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
17130 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
17140 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
17150 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
17160 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
17170 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
17180 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
17190 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
171a0 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
171b0 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
171c0 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
171d0 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
171e0 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
171f0 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
17200 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
17210 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
17220 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
17230 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
17240 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
17250 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
17260 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17270 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17280 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17290 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
172a0 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
172b0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
172c0 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
172d0 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
172e0 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
172f0 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17300 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
17310 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
17320 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
17330 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
17340 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
17350 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17360 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
17370 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17380 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17390 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
173a0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
173b0 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
173c0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
173d0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
173e0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
173f0 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17400 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17410 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
17420 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
17430 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17440 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17450 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17460 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17470 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17480 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17490 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
174a0 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
174b0 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
174c0 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
174d0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
174e0 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
174f0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17500 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17510 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
17520 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
17530 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17540 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17550 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17560 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17570 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17590 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
175a0 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
175b0 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
175c0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
175d0 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
175e0 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
175f0 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
17600 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
17610 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
17620 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
17630 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
17640 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
17650 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
17660 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
17670 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17680 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
17690 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
176a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
176b0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
176c0 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
176d0 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
176e0 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
176f0 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
17700 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
17710 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
17720 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
17730 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
17740 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
17750 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17760 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
17770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17780 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
17790 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
177a0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
177b0 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
177c0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
177d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
177e0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
177f0 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  g==0 || pPager->
17800 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41  tempFile );.  PA
17810 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
17820 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
17830 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
17840 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
17850 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
17860 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
17870 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
17880 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
17890 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
178a0 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
178b0 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
178c0 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
178d0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
178e0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
178f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
17900 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
17910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17920 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17930 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
17940 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
17950 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
17960 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
17970 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
17980 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
17990 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
179a0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
179b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
179c0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
179d0 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
179e0 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
179f0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
17a00 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
17a10 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
17a20 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
17a30 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
17a40 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
17a50 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
17a60 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17a70 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17a80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17a90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
17aa0 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
17ab0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17ac0 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  e, ofst);.    if
17ad0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
17ae0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
17af0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
17b00 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
17b10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
17b20 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
17b30 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
17b40 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
17b50 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
17b60 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
17b70 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
17b80 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
17b90 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
17ba0 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43  )aData);.      C
17bb0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
17bc0 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
17bd0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
17be0 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  PT, aData);.    
17bf0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
17c00 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
17c10 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
17c20 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
17c30 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
17c40 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
17c50 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
17c60 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17c70 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
17c80 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
17c90 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
17ca0 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
17cb0 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
17cc0 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17cd0 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17ce0 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17cf0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
17d00 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
17d10 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
17d20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
17d30 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
17d40 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
17d50 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17d60 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
17d70 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
17d80 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
17d90 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
17da0 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
17db0 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
17dc0 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17dd0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17de0 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17df0 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
17e00 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
17e10 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17e20 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
17e30 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
17e40 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
17e50 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17e60 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
17e70 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
17e80 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
17e90 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
17ea0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
17eb0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
17ec0 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17ed0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17ee0 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17ef0 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
17f00 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
17f10 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
17f20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
17f30 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
17f40 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
17f50 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17f60 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
17f70 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
17f80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
17f90 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
17fa0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
17fb0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
17fc0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
17fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
17fe0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
17ff0 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18000 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ACK;.    rc = sq
18010 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
18020 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
18030 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
18040 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
18050 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
18060 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29  G_ROLLBACK)!=0 )
18070 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
18080 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
18090 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
180a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
180b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
180c0 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  rc;.    pPg->fla
180d0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
180e0 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
180f0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
18100 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
18110 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
18120 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
18130 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
18140 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
18150 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
18160 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
18170 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
18180 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
18190 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
181a0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
181b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
181c0 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
181d0 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
181e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
181f0 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
18200 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
18210 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
18220 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
18230 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
18240 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
18250 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
18260 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
18270 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
18280 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
18290 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
182a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
182b0 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
182c0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
182d0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69  );.    if( isMai
182e0 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
182f0 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
18300 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
18310 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
18320 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
18330 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
18340 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
18350 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
18360 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
18370 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
18380 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
18390 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
183a0 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
183b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
183c0 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
183d0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
183e0 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
183f0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
18400 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
18410 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
18420 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
18430 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
18440 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
18450 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  **.      ** Ther
18460 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69  e is one excepti
18470 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e  on to this rule.
18480 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
18490 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20  being rolled.   
184a0 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61     ** back as pa
184b0 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  rt of a savepoin
184c0 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29  t (or statement)
184d0 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61   rollback from a
184e0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79  n .      ** unsy
184f0 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
18500 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
18510 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
18520 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20  s not safe.     
18530 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20   ** to mark the 
18540 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54  page as clean. T
18550 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d  his is because m
18560 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20  arking the page 
18570 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  as.      ** clea
18580 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65  n will clear the
18590 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
185a0 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65   flag. Since the
185b0 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a   page is.      *
185c0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
185d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72   journal file (r
185e0 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72  ecorded in Pager
185f0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64  .pInJournal) and
18600 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
18610 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
18620 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69  ag is cleared, i
18630 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
18640 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a  itten to.      *
18650 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  * again within t
18660 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
18670 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b   it will be mark
18680 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a  ed as dirty but.
18690 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
186a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
186b0 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65  g will not be se
186c0 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e  t. It could then
186d0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20   potentially.   
186e0 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e     ** be written
186f0 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61   out into the da
18700 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
18710 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  re its journal f
18720 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  ile.      ** seg
18730 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20  ment is synced. 
18740 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  If a crash occur
18750 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c  s during or foll
18760 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20  owing this,.    
18770 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
18780 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73  rruption may ens
18790 75 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ue..      **.   
187a0 20 20 20 2a 2a 20 55 70 64 61 74 65 3a 20 41 6e     ** Update: An
187b0 6f 74 68 65 72 20 65 78 63 65 70 74 69 6f 6e 20  other exception 
187c0 69 73 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  is for temp file
187d0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 0a  s that are not .
187e0 20 20 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f        ** in-memo
187f0 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 49 6e  ry databases. In
18800 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
18810 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  age may have bee
18820 6e 20 64 69 72 74 79 0a 20 20 20 20 20 20 2a 2a  n dirty.      **
18830 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
18840 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18850 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18860 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
18870 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
18880 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
18890 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
188a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
188b0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
188c0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
188d0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
188e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
188f0 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
18900 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
18910 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
18920 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
18930 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
18940 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
18950 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
18960 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18970 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
18980 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
18990 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
189a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
189b0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
189c0 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
189d0 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
189e0 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
189f0 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
18a00 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
18a10 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18a20 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c 69  _BKPT);.    sqli
18a30 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
18a40 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
18a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18a60 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
18a70 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
18a80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
18a90 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
18aa0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
18ab0 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
18ac0 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
18ad0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
18ae0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
18af0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
18b00 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
18b10 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
18b20 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
18b30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18b40 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
18b50 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
18b60 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
18b70 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
18b80 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
18b90 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
18ba0 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
18bb0 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
18bc0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18bd0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
18be0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18bf0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
18c00 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
18c10 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
18c20 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
18c30 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
18c40 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
18c50 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
18c60 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
18c70 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
18c80 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
18c90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
18ca0 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
18cb0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
18cc0 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
18cd0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
18ce0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
18cf0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18d00 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
18d10 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
18d20 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
18d30 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
18d40 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
18d50 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
18d60 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
18d70 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
18d80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18d90 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
18da0 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
18db0 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
18dc0 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
18dd0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
18de0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
18df0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
18e00 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18e10 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18e20 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
18e30 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
18e40 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
18e50 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
18e60 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
18e70 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
18e80 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18e90 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18ea0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
18eb0 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
18ec0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18ed0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
18ee0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
18ef0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
18f00 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
18f10 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
18f20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
18f30 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
18f40 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
18f50 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
18f60 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
18f70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
18f80 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18f90 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
18fa0 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
18fb0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18fc0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
18fd0 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
18fe0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
18ff0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
19000 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
19010 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
19020 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
19030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
19040 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
19050 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
19060 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
19070 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
19080 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
19090 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
190a0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
190b0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
190c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
190d0 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
190e0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
190f0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
19100 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19110 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
19120 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
19130 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
19140 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
19150 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
19160 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
19170 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
19180 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
19190 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
191a0 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
191b0 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
191c0 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
191d0 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
191e0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
191f0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
19200 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
19210 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
19220 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
19230 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
19240 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
19250 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19270 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
19280 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
19290 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
192a0 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
192b0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
192c0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
192d0 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
192e0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
192f0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
19300 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
19310 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
19320 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
19330 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
19340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19350 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
19360 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
19370 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
19380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19390 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
193a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
193b0 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
193c0 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
193d0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
193e0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
193f0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
19400 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
19410 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
19420 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
19430 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19440 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
19450 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
19460 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
19470 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
19480 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
19490 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
194a0 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
194b0 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
194c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
194d0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
194e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
194f0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
19500 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
19510 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
19520 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
19530 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
19540 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
19550 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
19560 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
19570 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
19580 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
19590 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
195a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
195b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
195c0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
195d0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
195e0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
195f0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
19600 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
19610 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19620 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
19630 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
19640 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19650 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19660 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
19670 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19680 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19690 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
196a0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
196b0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
196c0 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
196d0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
196e0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
196f0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
19700 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
19710 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
19720 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
19730 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
19740 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
19750 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
19760 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
19770 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19780 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19790 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
197a0 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
197b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
197c0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
197d0 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
197e0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
197f0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
19800 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
19810 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
19820 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
19830 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
19840 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
19850 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
19860 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19870 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
19880 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
19890 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
198a0 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
198b0 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
198c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
198d0 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
198e0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
198f0 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
19900 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
19910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19920 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19930 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
19940 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
19950 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
19960 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
19970 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
19980 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
19990 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
199a0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
199b0 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
199c0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
199d0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
199e0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
199f0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
19a00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19a20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19a30 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
19a40 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
19a50 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
19a60 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
19a70 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
19a80 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
19a90 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
19aa0 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
19ab0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
19ac0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19ad0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
19ae0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
19af0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
19b00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19b10 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19b20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
19b30 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
19b40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
19b50 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
19b60 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
19b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19b80 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
19b90 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
19ba0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
19bb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19bc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
19bd0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19be0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19bf0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
19c00 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
19c10 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
19c20 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
19c30 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
19c40 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
19c50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19c60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
19c70 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19c80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19c90 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
19ca0 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
19cb0 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
19cc0 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
19cd0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
19ce0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
19cf0 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
19d00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19d10 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
19d20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19d30 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19d40 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
19d50 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
19d60 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
19d70 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
19d80 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19d90 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
19da0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
19db0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
19dc0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
19dd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19de0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
19df0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
19e00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
19e10 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
19e20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
19e30 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
19e40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19e50 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
19e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
19e70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19e80 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
19e90 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
19ea0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19eb0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
19ec0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
19ed0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
19ee0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
19ef0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
19f00 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
19f10 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
19f20 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
19f30 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
19f40 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
19f50 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
19f60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19f70 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
19f80 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
19f90 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
19fa0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
19fb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19fc0 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
19fd0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
19fe0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
19ff0 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
1a000 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
1a010 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a020 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
1a030 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
1a040 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
1a050 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
1a060 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
1a070 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
1a080 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
1a090 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
1a0a0 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
1a0b0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1a0c0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1a0d0 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
1a0e0 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
1a0f0 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
1a100 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
1a110 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
1a120 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
1a130 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
1a140 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
1a150 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
1a160 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
1a170 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
1a180 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
1a190 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
1a1a0 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
1a1b0 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
1a1c0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
1a1d0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
1a1e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1a1f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a200 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1a210 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
1a220 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
1a230 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
1a240 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
1a250 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
1a260 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a270 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1a280 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1a290 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
1a2a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a2c0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1a2d0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
1a2e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1a2f0 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
1a300 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
1a310 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1a320 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
1a330 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1a340 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1a350 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1a360 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
1a370 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
1a380 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
1a390 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
1a3a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a3b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1a3c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
1a3d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
1a3e0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
1a3f0 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
1a400 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
1a410 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
1a420 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1a430 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1a440 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
1a450 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
1a460 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
1a470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a480 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
1a490 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
1a4a0 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
1a4b0 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
1a4c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a4d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1a4e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
1a4f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
1a500 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69  e if( (currentSi
1a510 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53  ze+szPage)<=newS
1a520 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ize ){.        c
1a530 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67  har *pTmp = pPag
1a540 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1a550 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
1a560 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a  mp, 0, szPage);.
1a570 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a580 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1a590 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
1a5a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
1a5b0 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1a5c0 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
1a5d0 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1a5e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a5f0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1a600 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
1a610 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
1a620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a640 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1a650 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1a660 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
1a670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a680 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a690 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a  Return a sanitiz
1a6a0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1a6b0 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66  e sector-size of
1a6c0 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20   OS file pFile. 
1a6d0 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
1a6e0 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  lue is guarantee
1a6f0 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e  d to lie between
1a700 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54   32 and MAX_SECT
1a710 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20  OR_SIZE..*/.int 
1a720 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1a730 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1a740 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  pFile){.  int iR
1a750 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  et = sqlite3OsSe
1a760 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b  ctorSize(pFile);
1a770 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29  .  if( iRet<32 )
1a780 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32  {.    iRet = 512
1a790 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52  ;.  }else if( iR
1a7a0 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  et>MAX_SECTOR_SI
1a7b0 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
1a7c0 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
1a7d0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52  E>=512 );.    iR
1a7e0 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  et = MAX_SECTOR_
1a7f0 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1a800 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
1a810 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1a820 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
1a830 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1a840 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
1a850 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
1a860 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a870 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a880 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
1a890 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
1a8a0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1a8b0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1a8c0 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
1a8d0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1a8e0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
1a8f0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
1a900 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
1a910 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
1a920 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
1a930 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
1a940 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
1a950 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
1a960 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a970 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
1a980 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
1a990 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
1a9a0 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
1a9b0 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
1a9c0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a9d0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1a9e0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a9f0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
1aa00 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
1aa10 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
1aa20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
1aa30 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
1aa40 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1aa50 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
1aa60 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
1aa70 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
1aa80 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1aa90 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
1aaa0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1aab0 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
1aac0 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
1aad0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1aae0 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
1aaf0 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
1ab00 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
1ab10 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
1ab20 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
1ab30 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
1ab40 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
1ab50 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1ab60 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
1ab70 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
1ab80 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
1ab90 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
1aba0 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
1abb0 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
1abc0 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
1abd0 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
1abe0 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
1abf0 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
1ac00 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
1ac10 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
1ac20 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1ac30 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1ac40 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1ac50 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ac60 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1ac70 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1ac80 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1ac90 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1aca0 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1acb0 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1acc0 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1acd0 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1ace0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1acf0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1ad00 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1ad10 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1ad20 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1ad30 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1ad40 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1ad50 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1ad60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1ad70 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1ad80 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1ad90 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1ada0 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1adb0 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1adc0 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1add0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1ade0 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1adf0 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1ae00 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1ae10 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1ae20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1ae30 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1ae40 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1ae50 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1ae60 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1ae70 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1ae80 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1ae90 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1aea0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1aeb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1aec0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1aed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1aee0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1aef0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1af00 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1af10 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1af20 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1af30 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1af40 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1af50 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1af60 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1af70 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1af80 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1af90 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1afa0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1afb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1afc0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1afd0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1afe0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1aff0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1b000 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1b010 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1b020 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1b030 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1b040 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1b050 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1b060 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b070 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1b080 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1b090 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1b0a0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1b0b0 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1b0c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b0d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b0e0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1b0f0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1b100 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1b110 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1b120 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1b130 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b140 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1b150 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1b160 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1b170 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1b180 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1b190 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1b1a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b1b0 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1b1c0 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1b1d0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1b1e0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1b1f0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1b200 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1b210 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1b220 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1b230 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1b240 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1b250 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1b260 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1b270 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1b280 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1b290 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1b2a0 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1b2b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1b2c0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1b2d0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1b2e0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1b2f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1b300 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1b310 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1b320 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1b330 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1b340 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1b350 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1b360 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1b370 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1b380 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1b390 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1b3a0 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1b3b0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1b3c0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1b3d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1b3e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1b3f0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1b400 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1b410 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1b420 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1b430 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1b440 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1b450 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1b460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b470 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1b480 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1b490 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1b4a0 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1b4b0 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1b4c0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1b4d0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1b4e0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1b4f0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1b500 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1b510 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1b520 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1b530 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1b540 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1b550 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1b560 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1b570 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1b580 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1b590 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1b5a0 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1b5b0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1b5c0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1b5d0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1b5e0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1b5f0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1b600 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1b610 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1b620 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1b630 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1b640 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1b650 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1b660 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1b670 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1b680 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1b690 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1b6a0 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1b6b0 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1b6c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1b6d0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1b6e0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1b6f0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1b700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1b710 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1b720 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1b730 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1b740 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1b750 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1b760 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b770 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1b780 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1b790 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1b7a0 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1b7b0 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1b7c0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1b7d0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1b7e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1b7f0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1b800 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1b810 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1b820 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1b830 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1b840 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1b850 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1b860 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1b870 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1b880 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1b890 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1b8a0 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1b8b0 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1b8c0 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1b8d0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1b8e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1b8f0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1b900 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1b910 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1b920 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1b930 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1b940 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1b950 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1b960 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1b970 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1b980 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1b990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1b9a0 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1b9b0 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1b9c0 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1b9d0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1b9e0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1b9f0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1ba00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1ba10 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1ba20 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1ba50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1ba60 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1ba70 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1ba80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ba90 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1baa0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1bab0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1bac0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1bad0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1bae0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1baf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1bb00 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1bb10 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1bb20 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1bb50 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1bb60 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb80 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1bb90 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1bba0 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1bbb0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1bbc0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1bbd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1bbe0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1bbf0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1bc00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1bc10 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1bc20 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1bc30 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
1bc40 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b  t nPlayback = 0;
1bc50 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1bc60 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bc70 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f  restored from jo
1bc80 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46  urnal */..  /* F
1bc90 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1bca0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
1bcb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1bcc0 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
1bcd0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
1bce0 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
1bcf0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1bd00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1bd10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1bd20 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1bd30 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
1bd40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bd50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1bd60 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
1bd70 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
1bd80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1bd90 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
1bda0 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
1bdb0 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
1bdc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1bdd0 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
1bde0 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
1bdf0 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
1be00 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
1be10 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1be20 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
1be30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1be40 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
1be50 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
1be60 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
1be70 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
1be80 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
1be90 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
1bea0 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
1beb0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
1bec0 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
1bed0 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
1bee0 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
1bef0 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
1bf00 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
1bf10 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1bf20 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
1bf30 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74  ix.c,.  ** mxPat
1bf40 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1bf50 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1bf60 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1bf70 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1bf80 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1bf90 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1bfa0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1bfb0 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1bfc0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1bfd0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1bfe0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1bff0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c000 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c010 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1c020 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1c030 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1c040 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1c050 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1c060 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1c070 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1c080 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c090 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1c0a0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c0b0 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1c0c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1c0d0 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1c0e0 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1c0f0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1c100 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1c110 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1c120 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1c130 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1c140 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1c150 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1c160 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1c170 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1c180 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1c190 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1c1a0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1c1b0 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1c1c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1c1d0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1c1e0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1c1f0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1c200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1c210 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1c220 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1c230 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1c240 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1c250 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1c260 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1c270 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1c280 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1c290 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1c2a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1c2b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1c2c0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1c2d0 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1c2e0 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1c2f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c300 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1c310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1c320 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1c330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1c350 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1c360 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1c370 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1c380 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1c390 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1c3a0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1c3b0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1c3c0 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1c3d0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1c3e0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1c3f0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1c400 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1c410 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1c420 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1c430 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1c440 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1c450 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1c460 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1c470 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1c480 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1c490 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1c4a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1c4b0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1c4c0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c4d0 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1c4e0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1c4f0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c500 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1c510 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1c520 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1c530 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1c540 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1c550 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1c560 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1c570 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1c580 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1c590 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1c5a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1c5b0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1c5c0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1c5d0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c5e0 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1c5f0 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1c600 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1c610 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1c620 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1c630 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1c640 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1c650 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1c660 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1c670 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1c680 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1c690 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1c6a0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1c6b0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1c6c0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1c6d0 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1c6e0 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1c6f0 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1c700 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1c710 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1c720 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1c730 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1c740 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1c750 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1c760 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1c770 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1c780 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1c790 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c7a0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c7b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1c7c0 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1c7d0 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1c7e0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c7f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1c800 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1c810 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1c820 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1c830 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1c840 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c850 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c860 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1c870 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1c880 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c890 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1c8a0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1c8b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c8c0 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1c8d0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1c8e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1c8f0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1c900 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1c910 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c920 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1c930 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1c940 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1c950 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1c960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1c970 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1c980 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1c990 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c9a0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1c9b0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c9c0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1c9d0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1c9e0 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1c9f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ca00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ca10 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1ca20 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1ca30 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1ca40 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1ca50 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1ca60 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1ca70 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1ca80 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1ca90 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1caa0 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1cab0 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1cac0 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1cad0 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1cae0 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1caf0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1cb00 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1cb10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1cb20 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1cb30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1cb40 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1cb50 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1cb60 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1cb70 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1cb80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1cb90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cba0 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1cbb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cbc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cbd0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1cbe0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1cbf0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1cc00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1cc10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1cc20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1cc30 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1cc40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1cc50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1cc60 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1cc70 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1cc80 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1cc90 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1cca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1ccb0 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1ccc0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1ccd0 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1cce0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1ccf0 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1cd00 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1cd10 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1cd20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1cd30 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1cd40 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1cd50 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1cd60 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1cd70 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1cd80 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1cd90 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1cda0 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1cdb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cdc0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1cdd0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1cde0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1cdf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1ce00 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1ce10 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1ce20 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1ce30 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1ce40 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1ce50 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1ce60 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1ce70 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1ce80 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1ce90 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1cea0 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1ceb0 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1cec0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1ced0 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1cee0 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1cef0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1cf00 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1cf10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1cf20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cf30 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1cf40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cf50 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1cf60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1cf70 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1cf80 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
1cf90 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
1cfa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1cfb0 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
1cfc0 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
1cfd0 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
1cfe0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1cff0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
1d000 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
1d010 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
1d020 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
1d030 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
1d040 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
1d050 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
1d060 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1d070 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
1d080 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69  odified..  */.#i
1d090 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1d0a0 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  G.  if( pPager->
1d0b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1d0c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1d0d0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
1d0e0 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1d0f0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1d100 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  D,0);.  }.#endif
1d110 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1d120 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1d130 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1d140 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1d150 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1d160 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1d170 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1d180 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1d190 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1d1a0 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1d1b0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1d1c0 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1d1d0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1d1e0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1d1f0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1d200 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1d210 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1d220 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1d230 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1d240 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1d250 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1d260 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1d270 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1d280 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1d290 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d2a0 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1d2b0 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1d2c0 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1d2d0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1d2e0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1d2f0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1d300 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1d310 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1d320 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1d330 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1d340 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1d350 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1d360 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1d370 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1d380 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1d390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d3a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1d3b0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1d3c0 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1d3d0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1d3e0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1d3f0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1d400 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1d410 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1d420 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1d430 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1d440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1d450 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1d460 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1d470 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1d480 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1d490 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1d4a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d4b0 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  Sync(pPager, 0);
1d4c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d4d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d4e0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
1d4f0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1d500 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
1d510 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  \0', 0);.    tes
1d520 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d530 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d550 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1d560 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1d570 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1d580 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1d590 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1d5a0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1d5b0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1d5c0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1d5d0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1d5e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1d5f0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1d600 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1d610 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1d620 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d640 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26   }.  if( isHot &
1d650 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20  & nPlayback ){. 
1d660 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
1d670 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
1d680 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22  OVER_ROLLBACK, "
1d690 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67  recovered %d pag
1d6a0 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20  es from %s",.   
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c               nPl
1d6c0 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e  ayback, pPager->
1d6d0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a  zJournal);.  }..
1d6e0 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1d6f0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1d700 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1d710 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1d720 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1d730 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1d740 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1d750 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1d760 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1d770 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1d780 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1d790 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1d7a0 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1d7b0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1d7c0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1d7d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d7e0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1d7f0 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1d800 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d810 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1d820 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1d830 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1d840 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1d850 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1d860 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1d870 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d880 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1d890 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1d8a0 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1d8b0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1d8c0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1d8d0 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1d8e0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1d8f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1d900 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1d910 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d920 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1d930 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d940 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1d950 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1d960 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d970 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1d980 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1d990 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20  , u32 iFrame){. 
1d9a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d9b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1d9c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1d9d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1d9e0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1d9f0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1da00 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1da10 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1da20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1da30 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1da40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1da50 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1da60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1da70 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1da80 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1da90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1daa0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1dab0 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1dac0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1dad0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1dae0 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
1daf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1db00 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1db10 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1db20 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1db30 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1db40 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1db50 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1db60 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1db70 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1db80 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1db90 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1dba0 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1dbb0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1dbc0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1dbd0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1dbe0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1dbf0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1dc00 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1dc10 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1dc20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1dc30 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1dc40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1dc50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1dc60 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1dc70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1dc80 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1dc90 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1dca0 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1dcb0 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1dcc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1dcd0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1dce0 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1dcf0 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1dd00 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1dd10 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1dd20 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1dd30 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1dd40 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1dd50 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1dd60 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1dd70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1dd80 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1dd90 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1dda0 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1ddb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1ddc0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1ddd0 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1dde0 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1ddf0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1de00 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1de10 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1de20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1de30 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1de40 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1de50 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1de60 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1de70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1de80 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1de90 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1dea0 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1deb0 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1dec0 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1ded0 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69  ite noise equali
1dee0 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1def0 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1df00 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1df10 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1df20 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1df30 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1df40 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1df50 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1df60 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1df70 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1df80 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1df90 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1dfa0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1dfb0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1dfc0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1dfd0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1dfe0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1dff0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1e000 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1e010 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1e020 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
1e030 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1e040 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f  BKPT);..  PAGER_
1e050 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1e060 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
1e070 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
1e080 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
1e090 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
1e0a0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1e0b0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
1e0c0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1e0d0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1e0e0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1e0f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1e100 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
1e110 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1e120 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
1e130 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64  rc;.}../*.** Upd
1e140 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ate the value of
1e150 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1e160 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32  ter at offsets 2
1e170 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74  4 and 92 in.** t
1e180 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  he header and th
1e190 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e  e sqlite version
1e1a0 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65   number at offse
1e1b0 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t 96..**.** This
1e1c0 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69   is an unconditi
1e1d0 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65  onal update.  Se
1e1e0 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72  e also the pager
1e1f0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1e200 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ter().** routine
1e210 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61   which only upda
1e220 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
1e230 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70  ounter if the up
1e240 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79  date is actually
1e250 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64  .** needed, as d
1e260 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1e270 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1e280 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76  ountDone state v
1e290 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1e2a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72  ic void pager_wr
1e2b0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1e2c0 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
1e2d0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1e2e0 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  ter;..  /* Incre
1e2f0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1e300 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1e310 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1e320 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1e330 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
1e340 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
1e350 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  *)pPg->pPager->d
1e360 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20  bFileVers)+1;.  
1e370 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1e380 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34  *)pPg->pData)+24
1e390 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1e3a0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74  );..  /* Also st
1e3b0 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
1e3c0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
1e3d0 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e   bytes 96..99 an
1e3e0 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20  d in.  ** bytes 
1e3f0 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
1e400 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1e410 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
1e420 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a  rsion number.  *
1e430 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  * is valid. */. 
1e440 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e450 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1e460 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
1e470 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  r);.  put32bits(
1e480 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1e490 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56  ta)+96, SQLITE_V
1e4a0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a  ERSION_NUMBER);.
1e4b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1e4c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1e4d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e4e0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1e4f0 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1e500 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1e510 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1e520 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1e530 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1e540 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e550 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1e560 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1e570 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1e580 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1e590 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1e5a0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1e5b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1e5c0 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1e5d0 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1e5e0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1e5f0 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1e600 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1e610 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1e620 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1e630 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e640 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1e650 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1e660 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1e670 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1e680 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1e690 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1e6a0 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1e6b0 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1e6c0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e6d0 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1e6e0 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1e6f0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1e700 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1e710 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1e720 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1e730 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e740 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1e750 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1e760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e770 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e780 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1e790 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1e7a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1e7b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1e7c0 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1e7d0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1e7e0 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1e7f0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1e800 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1e810 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1e820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e830 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1e840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e850 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20     u32 iFrame = 
1e860 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
1e870 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
1e880 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e890 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61  pPg->pgno, &iFra
1e8a0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
1e8b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e8c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
1e8d0 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
1e8e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1e8f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e910 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1e920 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1e930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e940 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1e950 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1e960 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1e970 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1e980 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1e990 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1e9a0 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1e9b0 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1e9c0 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1e9d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e9e0 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1e9f0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1ea00 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1ea10 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1ea20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1ea30 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1ea40 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1ea50 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1ea60 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1ea70 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1ea80 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1ea90 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1eaa0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1eab0 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1eac0 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1ead0 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1eae0 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1eaf0 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1eb00 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1eb10 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1eb20 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1eb30 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1eb40 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1eb50 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1eb60 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1eb70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1eb80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1eb90 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1eba0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1ebb0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1ebc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ebd0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1ebe0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ebf0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1ec20 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1ec30 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1ec40 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1ec50 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1ec60 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1ec70 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1ec80 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1ec90 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1eca0 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1ecb0 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1ecc0 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1ecd0 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1ece0 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1ecf0 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1ed00 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1ed10 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1ed20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1ed30 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1ed40 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1ed50 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1ed60 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1ed70 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1ed80 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1ed90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1eda0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1edb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1edc0 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1edd0 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1ede0 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1edf0 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1ee00 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1ee10 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1ee20 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1ee30 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1ee40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ee50 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1ee60 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1ee70 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1ee80 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1ee90 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1eea0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1eeb0 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1eec0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1eed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1eee0 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1eef0 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1ef00 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1ef10 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1ef20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1ef30 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1ef40 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1ef50 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1ef60 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1ef70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1ef80 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1ef90 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1efa0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1efb0 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1efc0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1efd0 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1efe0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1eff0 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1f000 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1f010 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1f020 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1f030 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1f040 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1f050 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1f060 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1f070 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1f080 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1f090 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1f0a0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1f0b0 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1f0c0 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1f0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1f0e0 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1f0f0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1f100 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1f110 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f120 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1f130 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1f140 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f160 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1f170 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1f180 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f1b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1f1c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f1d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f1e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1f1f0 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  st */.  PgHdr *p
1f200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f210 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1f220 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1f230 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1f240 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1f250 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1f260 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1f270 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1f280 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1f290 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1f2a0 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1f2b0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1f2c0 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1f2d0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1f2e0 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1f2f0 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1f300 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1f310 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1f320 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1f330 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1f340 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1f350 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1f360 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1f370 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1f380 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1f390 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1f3a0 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1f3b0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1f3c0 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1f3d0 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1f3e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1f3f0 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1f400 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1f410 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1f420 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1f430 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1f440 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1f450 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1f460 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1f470 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1f480 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1f490 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1f4a0 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1f4b0 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1f4c0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1f4d0 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1f4e0 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1f4f0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1f500 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1f510 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1f520 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1f530 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1f540 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1f550 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1f560 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1f570 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1f580 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1f590 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1f5a0 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1f5b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1f5c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1f5d0 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1f5e0 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1f5f0 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1f600 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1f610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f620 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1f630 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  ckup ){.    for(
1f640 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1f650 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1f660 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1f670 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1f680 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1f690 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1f6a0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1f6b0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1f6c0 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
1f6d0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1f6e0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1f6f0 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
1f700 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1f710 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
1f720 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
1f730 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f750 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
1f760 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f770 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
1f780 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
1f790 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
1f7a0 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
1f7b0 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
1f7c0 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
1f7d0 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
1f7e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1f7f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
1f800 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
1f810 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
1f820 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
1f830 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
1f840 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
1f850 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
1f860 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
1f870 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
1f880 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
1f890 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
1f8a0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f8b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f8c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1f8f0 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
1f900 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1f910 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f920 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
1f930 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
1f940 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f950 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
1f960 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f970 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
1f980 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1f990 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
1f9a0 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
1f9b0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1f9c0 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
1f9d0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
1f9e0 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
1f9f0 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
1fa00 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
1fa10 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
1fa20 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
1fa30 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
1fa40 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
1fa50 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
1fa60 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
1fa70 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
1fa80 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
1fa90 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1faa0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1fab0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1fac0 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
1fad0 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
1fae0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1faf0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
1fb00 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
1fb10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
1fb20 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
1fb30 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1fb40 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
1fb50 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
1fb60 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
1fb70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
1fb80 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1fb90 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1fba0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1fbb0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1fbc0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1fbd0 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
1fbe0 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
1fbf0 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
1fc00 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1fc10 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1fc20 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
1fc30 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
1fc40 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
1fc50 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1fc60 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
1fc70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
1fc80 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1fc90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fca0 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
1fcb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1fcc0 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
1fcd0 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
1fce0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1fcf0 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
1fd00 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
1fd10 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
1fd20 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1fd30 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
1fd40 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
1fd50 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
1fd60 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1fd70 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
1fd80 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fda0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1fdb0 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1fdc0 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
1fdd0 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
1fde0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
1fdf0 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
1fe00 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
1fe10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1fe20 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
1fe30 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
1fe40 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
1fe50 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
1fe60 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1fe70 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1fe80 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
1fe90 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
1fea0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1feb0 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1fec0 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
1fed0 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
1fee0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
1fef0 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
1ff00 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
1ff10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1ff20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1ff30 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1ff40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1ff50 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1ff60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1ff70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ff80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ff90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
1ffa0 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1ffb0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1ffc0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1ffd0 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
1ffe0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fff0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20000 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
20010 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
20020 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
20030 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
20040 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nte based on the
20050 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
20060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20070 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66    If the size of
20080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20090 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a  le is not an.  *
200a0 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  * integer multip
200b0 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
200c0 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68  ize, round up th
200d0 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
200e0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26   if( nPage==0 &&
200f0 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70   ALWAYS(isOpen(p
20100 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20  Pager->fd)) ){. 
20110 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66   /* Size of db f
20140 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
20150 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
20160 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
20170 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
20180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
201a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
201b0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
201c0 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
201d0 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
201e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
201f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
20200 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
20210 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
20220 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
20230 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
20240 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
20250 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
20260 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
20270 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
20280 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
20290 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
202a0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
202b0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
202c0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
202d0 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
202e0 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
202f0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
20300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20320 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
20330 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
20340 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
20350 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
20360 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
20370 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
20380 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
20390 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
203a0 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
203b0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
203c0 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
203d0 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
203e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
203f0 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
20400 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
20410 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
20420 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
20430 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
20440 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
20450 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
20460 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20470 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
20480 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
20490 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
204a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
204b0 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
204c0 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
204d0 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
204e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
204f0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20500 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
20510 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
20520 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
20530 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
20540 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20550 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
20560 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
20570 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
20580 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
20590 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
205a0 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
205b0 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
205c0 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
205d0 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
205e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
205f0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
20600 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
20610 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
20620 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
20630 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
20640 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
20650 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
20660 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
20670 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
20680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20690 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
206a0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
206b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
206c0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
206d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
206e0 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
206f0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
20700 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
20710 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
20740 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
20750 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
20780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20790 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
207a0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
207b0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
207c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
207d0 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
207e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
207f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
20800 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
20810 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
20820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20830 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
20840 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
20850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20860 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
20870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20880 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
20890 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
208a0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
208b0 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
208c0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
208d0 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
208e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
208f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20900 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
20910 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
20920 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
20930 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
20940 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
20950 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
20960 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
20970 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
20980 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
209a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
209b0 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
209c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
209d0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
209e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
209f0 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
20a00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20a10 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
20a20 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
20a30 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
20a40 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
20a50 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
20a60 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
20a70 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
20a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20a90 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
20aa0 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
20ab0 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
20ac0 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
20ad0 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
20ae0 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
20af0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
20b00 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
20b10 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
20b20 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
20b30 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
20b40 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
20b50 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
20b60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
20b70 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
20b80 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
20b90 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
20ba0 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
20bb0 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
20bc0 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
20bd0 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
20be0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
20bf0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20c00 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
20c10 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
20c20 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
20c30 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
20c40 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
20c50 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20c60 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
20c70 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
20c80 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
20c90 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
20ca0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20cb0 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
20cc0 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
20cd0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20ce0 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
20cf0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
20d00 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
20d10 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
20d20 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
20d30 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
20d40 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
20d50 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20d60 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
20d70 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
20d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20d90 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20da0 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
20db0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
20dc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
20dd0 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
20de0 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
20df0 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
20e00 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20e10 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
20e20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
20e30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
20e40 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
20e50 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
20e60 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
20e70 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
20e80 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20e90 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20ea0 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20eb0 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20ec0 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20ed0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20ee0 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20ef0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20f00 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20f10 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
20f20 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
20f30 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
20f40 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
20f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
20f60 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
20f70 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
20f80 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20f90 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20fb0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20fc0 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20fd0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20fe0 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20ff0 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
21000 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
21010 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
21020 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
21030 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
21040 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
21050 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
21060 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
21070 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
21080 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
21090 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
210a0 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
210b0 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
210c0 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
210d0 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
210e0 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
210f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
21100 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
21110 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
21120 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
21130 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
21140 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
21150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
21160 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
21170 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21180 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
21190 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
211a0 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
211b0 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
211c0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
211d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
211e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
211f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21200 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
21210 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
21220 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
21230 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
21240 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
21250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21260 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
21270 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
21280 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
21290 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
212a0 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
212b0 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
212c0 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
212d0 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
212e0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
212f0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21300 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
21310 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
21320 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
21330 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
21340 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
21350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21360 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
21370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
21380 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
21390 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
213a0 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
213b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
213c0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
213d0 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
213e0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
213f0 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
21400 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
21410 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
21420 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
21430 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
21440 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
21450 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
21460 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
21470 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21480 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
21490 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
214a0 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
214b0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
214c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
214d0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
214e0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
214f0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
21500 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
21510 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
21520 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
21530 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
21540 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
21550 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
21560 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
21570 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
21580 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
21590 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
215a0 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
215b0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
215c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
215d0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
215e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
215f0 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
21600 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
21610 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
21620 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
21630 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
21640 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
21650 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
21660 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
21670 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
21680 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
21690 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
216a0 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
216b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
216c0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
216d0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
216e0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
216f0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
21700 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
21710 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
21720 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
21730 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
21740 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
21750 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
21760 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
21770 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
21780 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
21790 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
217a0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
217b0 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
217c0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
217d0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
217e0 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
217f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21800 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
21810 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
21820 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21830 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
21840 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
21850 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
21860 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
21870 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
21880 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
21890 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
218a0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
218b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
218c0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
218d0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
218e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
218f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
21900 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
21910 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
21920 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21930 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
21940 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
21950 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
21960 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
21970 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
21980 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
21990 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
219a0 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
219b0 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
219c0 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
219d0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
219e0 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
219f0 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
21a00 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
21a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21a20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21a30 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
21a40 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21a50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21a60 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
21a70 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
21a80 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
21a90 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
21aa0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
21ab0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
21ac0 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
21ad0 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
21ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21af0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21b00 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
21b10 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
21b20 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21b30 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21b50 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
21b60 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
21b70 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
21b80 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
21b90 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
21ba0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
21bb0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
21bc0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
21bd0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
21be0 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
21bf0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21c00 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21c10 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21c20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21c30 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
21c40 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
21c50 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
21c60 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
21c70 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
21c80 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21c90 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
21ca0 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
21cb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21cc0 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
21cd0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21ce0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21cf0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
21d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21d10 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21d20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21d30 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21d40 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
21d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
21d60 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
21d70 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
21d80 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
21d90 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
21da0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
21db0 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
21dc0 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
21dd0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
21de0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
21df0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
21e00 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
21e10 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
21e20 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
21e30 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
21e40 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
21e50 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21e60 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21e80 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21e90 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
21ea0 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e  i64)pSavepoint->
21eb0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
21ec0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
21ed0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
21ee0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21f00 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f  WalSavepointUndo
21f10 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
21f20 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44  Savepoint->aWalD
21f30 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
21f40 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
21f50 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
21f60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21f70 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
21f80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
21f90 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69  sert( offset==(i
21fa0 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  64)ii*(4+pPager-
21fb0 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
21fc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21fd0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21fe0 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74  (pPager, &offset
21ff0 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a  , pDone, 0, 1);.
22000 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22020 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
22030 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
22040 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
22050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22060 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22070 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
22080 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
22090 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
220a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
220b0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
220c0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
220d0 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65  llowed.** before
220e0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
220f0 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64  ecycle clean and
22100 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e 0a 2a   unused pages..*
22110 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22120 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
22130 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
22140 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
22150 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
22160 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
22170 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
22180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
22190 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
221a0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
221b0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
221c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
221d0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
221e0 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74 6f 20   spill pages to 
221f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
22200 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
22210 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72 20 2a  pillsize(Pager *
22220 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
22230 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
22240 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 53 70  lite3PcacheSetSp
22250 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  illsize(pPager->
22260 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
22270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
22280 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
22290 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f  MAP_SIZE based o
222a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
222b0 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a  lue of szMmap..*
222c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
222d0 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50  gerFixMaplimit(P
222e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
222f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
22300 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69  AP_SIZE>0.  sqli
22310 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
22320 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28  Pager->fd;.  if(
22330 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66   isOpen(fd) && f
22340 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
22350 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20  rsion>=3 ){.    
22360 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
22370 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65  ;.    sz = pPage
22380 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70  r->szMmap;.    p
22390 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68  Pager->bUseFetch
223a0 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73   = (sz>0);.    s
223b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
223c0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
223d0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
223e0 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
223f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
22400 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
22410 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
22420 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
22430 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
22440 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22460 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
22470 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
22480 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
22490 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  map){.  pPager->
224a0 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
224b0 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  .  pagerFixMapli
224c0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  mit(pPager);.}..
224d0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
224e0 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
224f0 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
22500 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
22510 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
22520 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22530 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
22540 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
22550 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
22560 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67  * Adjust setting
22570 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74  s of the pager t
22580 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
22590 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73  d in the pgFlags
225a0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
225b0 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e  * The "level" in
225c0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
225d0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
225e0 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73  K sets the robus
225f0 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tness.** of the 
22600 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
22610 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
22620 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61  shes or power fa
22630 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61  ilures by.** cha
22640 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
22650 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
22660 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  n writing the jo
22670 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65  urnals..** There
22680 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73   are four levels
22690 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
226a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
226b0 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
226c0 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
226d0 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
226e0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
226f0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
22700 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
22710 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22720 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22730 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
22740 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22750 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
22760 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
22770 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
22780 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
22790 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
227b0 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
227c0 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
227d0 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
227e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
227f0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
22800 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
22810 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
22820 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
22830 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
22840 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
22850 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
22860 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
22880 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
22890 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
228a0 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
228b0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
228c0 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
228d0 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
228e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
228f0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
22900 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
22910 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
22920 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
22930 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
22940 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
22950 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
22960 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
22970 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
22980 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
22990 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
229a0 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
229b0 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
229c0 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
229d0 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
229e0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
229f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
22a00 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
22a10 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22a20 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
22a30 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
22a40 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
22a50 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
22a60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
22a70 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
22a80 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20  **.**    EXTRA  
22a90 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20     This is like 
22aa0 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74  FULL except that
22ab0 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74   is also syncs t
22ac0 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
22ae0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
22af0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
22b00 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61  after the rollba
22b10 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ck.**           
22b20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e     journal is un
22b30 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  linked..**.** Th
22b40 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
22b50 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
22b60 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
22b70 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
22b80 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
22b90 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
22ba0 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
22bb0 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22bc0 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
22bd0 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
22be0 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
22bf0 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
22c00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
22c10 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
22c20 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
22c30 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
22c40 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
22c50 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
22c60 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
22c70 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
22c80 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
22c90 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
22ca0 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
22cb0 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
22cc0 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
22cd0 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
22ce0 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
22cf0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
22d00 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
22d10 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
22d20 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
22d30 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
22d40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22d50 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69  NORMAL.  There i
22d60 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
22d70 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20  between FULL.** 
22d80 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41  and EXTRA for WA
22d90 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  L mode..**.** Do
22da0 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
22db0 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
22dc0 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
22dd0 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
22de0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
22df0 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
22e00 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
22e10 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
22e20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
22e30 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
22e40 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
22e50 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
22e60 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
22e70 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
22e80 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
22e90 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
22ea0 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
22eb0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22ec0 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
22ed0 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
22ee0 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
22ef0 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
22f00 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
22f10 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
22f20 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
22f30 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
22f40 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
22f50 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
22f60 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
22f70 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
22f80 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
22f90 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
22fa0 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
22fb0 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
22fc0 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
22fd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22fe0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
22ff0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23000 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
23010 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23020 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
23030 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
23040 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
23050 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
23060 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
23070 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
23080 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
23090 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
230a0 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
230b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
230c0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
230d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
230e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
230f0 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  lSync = 0;.    p
23100 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
23110 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23120 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
23130 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45  c =  level==PAGE
23140 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
23150 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  F ?1:0;.    pPag
23160 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
23170 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43  evel>=PAGER_SYNC
23180 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a  HRONOUS_FULL ?1:
23190 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
231a0 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c  xtraSync = level
231b0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
231c0 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a  OUS_EXTRA ?1:0;.
231d0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
231e0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
231f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23200 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
23210 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
23220 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23230 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23240 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
23250 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23260 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23270 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61  NC_FULL;.    pPa
23280 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
23290 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
232a0 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  _FULL;.  }else i
232b0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
232c0 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
232d0 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
232e0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
232f0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23300 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
23310 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
23320 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
23330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
23340 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23350 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23360 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
23370 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
23380 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23390 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  AL;.  }.  pPager
233a0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
233b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
233c0 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  gs;.  if( pPager
233d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
233e0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
233f0 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59  cFlags |= WAL_SY
23400 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
23410 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
23420 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
23430 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
23440 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23450 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
23460 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
23470 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23480 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
23490 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
234a0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
234b0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
234c0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
234d0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
234e0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
234f0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
23500 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23510 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
23520 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
23530 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
23540 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
23550 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23560 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
23570 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
23580 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
23590 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
235a0 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
235b0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
235c0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
235d0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
235e0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
235f0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
23600 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
23610 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
23620 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
23630 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
23640 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23650 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
23660 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
23670 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
23680 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
23690 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
236a0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
236b0 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
236c0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
236d0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
236e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
236f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23700 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23710 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
23720 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
23730 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
23740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23750 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
23760 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
23770 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
23780 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
23790 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
237a0 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
237b0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
237c0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
237d0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
237e0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
237f0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
23800 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
23810 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
23820 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
23830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23840 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
23850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23860 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
23870 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
23880 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
23890 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
238a0 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
238b0 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
238c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
238d0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
238e0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
238f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
23900 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
23910 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23920 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
23930 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
23940 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
23950 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
23960 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
23970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
23980 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
23990 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
239a0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
239b0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
239c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
239d0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
239e0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
239f0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
23a00 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
23a10 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
23a20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
23a30 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
23a40 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
23a50 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
23a60 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
23a70 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
23a80 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
23a90 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
23aa0 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
23ab0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
23ac0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
23ad0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
23ae0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
23af0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
23b00 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
23b10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
23b20 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
23b30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
23b40 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
23b50 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
23b60 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
23b70 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
23b80 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
23b90 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
23ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
23bd0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
23be0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
23bf0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
23c00 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
23c10 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
23c20 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
23c30 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
23c40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
23c50 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
23c60 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
23c70 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
23c80 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
23c90 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
23ca0 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
23cb0 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
23cc0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
23cd0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
23ce0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
23cf0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
23d00 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
23d10 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
23d20 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
23d30 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
23d40 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
23d50 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
23d60 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d80 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
23d90 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
23da0 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
23db0 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
23dc0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
23dd0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
23de0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
23df0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
23e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
23e10 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
23e20 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
23e30 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
23e40 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
23e50 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
23e60 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
23e70 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
23e80 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
23e90 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23ea0 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
23eb0 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
23ec0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23ed0 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
23ee0 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
23ef0 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
23f00 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
23f10 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
23f20 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
23f30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23f40 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
23f50 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23f60 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
23f70 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
23f80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
23f90 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
23fa0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
23fb0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
23fc0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23fd0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
23fe0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23ff0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24000 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24010 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24020 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24030 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
24040 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
24050 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
24060 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
24070 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
24080 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
24090 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
240a0 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
240b0 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
240c0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
240d0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
240e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
240f0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
24100 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
24110 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
24120 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
24130 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
24140 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
24150 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
24160 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
24170 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
24180 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
24190 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
241a0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
241b0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
241c0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
241d0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
241e0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
241f0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
24200 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
24210 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
24220 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
24230 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
24240 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
24250 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
24260 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
24270 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24280 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24290 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
242a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
242b0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
242c0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
242d0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
242e0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
242f0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
24300 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24310 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
24320 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
24330 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
24340 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
24350 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
24360 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
24370 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
24380 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24390 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
243a0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
243b0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
243c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
243d0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
243e0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
243f0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
24400 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
24410 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
24420 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
24430 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
24440 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24450 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24460 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24470 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24480 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24490 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
244a0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
244b0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
244c0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
244d0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
244e0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
244f0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24510 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
24520 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
24530 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
24540 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24550 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
24560 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24570 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24580 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24590 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
245a0 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
245b0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
245c0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
245d0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
245e0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
245f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24600 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
24610 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
24620 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
24630 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
24640 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
24650 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
24660 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24670 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24680 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24690 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
246a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
246b0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
246c0 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
246d0 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
246e0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
246f0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
24700 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
24710 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
24720 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
24730 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
24740 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
24750 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
24760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24770 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
24780 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24790 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
247a0 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
247b0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
247c0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
247d0 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
247e0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
247f0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
24800 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
24810 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
24820 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
24830 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
24840 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
24850 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24860 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24870 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
24880 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
24890 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
248a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
248b0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
248c0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
248d0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
248e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
248f0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
24900 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24910 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
24920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24930 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
24940 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
24950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
24960 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
24970 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
24980 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
24990 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
249a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
249b0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
249c0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
249d0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
249e0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
249f0 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
24a00 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
24a10 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
24a20 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
24a30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
24a40 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
24a50 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
24a60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
24a70 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
24a80 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
24a90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
24aa0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
24ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24ac0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
24ad0 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
24ae0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
24af0 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
24b00 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
24b10 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
24b20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
24b30 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
24b40 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
24b50 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
24b60 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
24b70 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
24b80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24b90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24ba0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
24bb0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
24bc0 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
24bd0 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
24be0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
24bf0 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
24c00 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
24c10 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
24c20 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
24c30 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
24c40 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
24c50 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
24c60 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
24c70 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
24c80 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
24c90 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
24ca0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
24cb0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
24cc0 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
24cd0 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
24ce0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
24cf0 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
24d00 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
24d10 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
24d20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
24d30 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
24d40 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
24d50 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
24d60 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
24d70 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
24d80 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
24d90 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
24da0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
24db0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
24dc0 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
24dd0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
24de0 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
24df0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
24e00 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
24e10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24e20 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
24e30 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
24e40 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
24e50 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
24e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24e70 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
24e80 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
24e90 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
24ea0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
24eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
24ec0 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
24ed0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24ee0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24ef0 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
24f00 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
24f10 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
24f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24f30 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
24f40 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
24f50 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
24f60 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
24f70 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
24f80 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
24f90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
24fa0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
24fb0 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
24fc0 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
24fd0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
24fe0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
24ff0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
25000 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
25010 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
25020 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
25030 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
25040 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
25050 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
25060 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
25070 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
25080 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
25090 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
250a0 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
250b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
250c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
250d0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
250e0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
250f0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
25100 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
25110 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
25120 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25130 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25140 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
25150 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25160 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
25170 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25180 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
25190 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
251a0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
251b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
251c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
251d0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
251e0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
251f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25200 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
25210 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
25220 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
25230 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
25240 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
25250 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
25260 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
25270 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
25280 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
25290 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
252a0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
252b0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
252c0 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
252d0 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
252e0 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
252f0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
25300 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
25310 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
25320 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
25330 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25340 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
25350 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
25360 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
25370 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25380 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
25390 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
253a0 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
253b0 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
253c0 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
253d0 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
253e0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
253f0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
25400 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
25410 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
25420 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
25430 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
25440 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
25450 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
25460 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25470 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25480 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25490 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
254a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
254b0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
254c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
254d0 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
254e0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
254f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25500 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
25510 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
25520 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
25530 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
25540 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
25550 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
25560 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25570 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
25580 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25590 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
255a0 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
255b0 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
255c0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
255d0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
255e0 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
255f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25600 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25610 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
25620 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25630 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
25640 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
25650 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
25660 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
25670 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25680 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
256a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
256b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
256c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
256d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
256e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
256f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
25700 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
25710 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
25720 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
25730 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
25740 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
25750 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
25760 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
25770 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
25780 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25790 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
257a0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
257b0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
257c0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
257d0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
257e0 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
257f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
25800 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
25810 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
25820 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
25830 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
25840 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
25850 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25860 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
25870 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
25880 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
25890 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
258a0 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
258b0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
258c0 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
258d0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
258e0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
258f0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
25900 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
25910 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
25920 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25930 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
25940 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
25950 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
25960 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
25970 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
25980 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
25990 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
259a0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
259b0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
259c0 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
259d0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
259e0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
259f0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
25a00 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
25a10 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
25a20 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
25a30 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
25a40 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
25a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
25a60 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
25a70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
25a80 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
25a90 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
25aa0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
25ab0 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
25ac0 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
25ad0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
25ae0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
25af0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25b10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
25b20 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
25b30 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
25b40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25b70 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
25b80 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
25b90 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
25ba0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
25bb0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
25bc0 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
25bd0 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
25be0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
25bf0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
25c00 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
25c10 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
25c20 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
25c30 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
25c40 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
25c50 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
25c60 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
25c70 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
25c80 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
25c90 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25ca0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
25cb0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
25cc0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
25cd0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25ce0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
25cf0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
25d00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
25d10 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
25d20 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
25d30 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
25d40 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
25d50 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
25d60 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
25d70 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
25d80 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
25d90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25da0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
25db0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25dc0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25dd0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
25de0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
25df0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
25e00 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
25e10 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
25e20 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
25e30 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
25e40 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
25e50 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
25e60 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
25e70 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
25e80 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
25e90 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
25ea0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
25eb0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
25ec0 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
25ed0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
25ee0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
25ef0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
25f00 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25f10 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
25f20 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
25f30 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
25f40 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
25f50 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
25f60 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
25f70 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
25f80 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
25f90 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
25fa0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
25fb0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
25fc0 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
25fd0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
25fe0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
25ff0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
26000 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
26010 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
26020 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
26030 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
26040 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
26050 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
26060 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
26070 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
26080 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
26090 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
260a0 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
260b0 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
260c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
260d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
260e0 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
260f0 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
26100 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26110 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
26120 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26130 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
26140 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
26150 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
26160 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
26170 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
26180 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
26190 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
261a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
261b0 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
261c0 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
261d0 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
261e0 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
261f0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
26200 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
26210 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
26220 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
26230 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26240 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
26250 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
26260 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
26270 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
26280 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
26290 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
262a0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
262b0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
262c0 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
262d0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
262e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
262f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26300 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
26310 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
26320 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
26330 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26340 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
26350 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
26360 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26370 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
26380 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
26390 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
263a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
263b0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
263c0 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
263d0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
263e0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
263f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26400 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
26410 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
26420 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
26430 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
26440 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
26450 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
26460 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26470 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26480 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26490 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
264a0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
264b0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
264c0 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
264d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
264e0 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
264f0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26500 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
26510 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
26520 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
26530 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
26540 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
26550 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
26560 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
26570 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
26580 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26590 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
265a0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
265b0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
265c0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
265d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
265e0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
265f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26600 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26610 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
26620 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
26630 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
26640 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
26650 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
26660 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
26670 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26680 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26690 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
266a0 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
266b0 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
266c0 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
266d0 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
266e0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
266f0 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
26700 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
26710 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
26720 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
26730 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
26740 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
26750 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
26760 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
26770 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
26780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26790 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
267a0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
267b0 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
267c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
267d0 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
267e0 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
267f0 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
26800 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
26810 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
26820 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
26830 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
26840 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
26850 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26860 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
26870 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
26880 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
26890 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
268a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
268b0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
268c0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
268d0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
268e0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
268f0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
26900 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
26910 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
26920 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
26930 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26940 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
26950 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
26960 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
26970 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
26980 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
26990 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
269a0 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
269b0 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
269c0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
269d0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
269e0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
269f0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
26a00 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
26a10 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26a20 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
26a30 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
26a40 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
26a50 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
26a60 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
26a70 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
26a80 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
26a90 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
26aa0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
26ab0 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
26ac0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26ad0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
26ae0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26af0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
26b00 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
26b10 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
26b20 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
26b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
26b40 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
26b50 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
26b60 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
26b70 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
26b80 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
26b90 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
26ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26bb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
26bc0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
26bd0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
26be0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
26bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26c00 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
26c10 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
26c20 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
26c30 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
26c40 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
26c50 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
26c60 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
26c70 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
26c80 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
26c90 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26ca0 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
26cb0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
26cc0 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
26cd0 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
26ce0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
26cf0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
26d00 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26d10 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
26d20 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
26d30 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
26d40 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
26d50 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
26d60 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
26d70 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
26d80 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
26d90 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
26da0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26db0 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
26dc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26de0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
26df0 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
26e00 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
26e10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26e20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
26e30 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
26e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26e50 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
26e60 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
26e70 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
26ea0 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
26eb0 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ed0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
26ee0 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
26ef0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
26f00 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
26f10 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
26f20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
26f30 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26f40 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
26f50 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26f60 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
26f70 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
26f80 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
26f90 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  tra, 0, pPager->
26fa0 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
26fb0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26fc0 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
26fd0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
26fe0 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
26ff0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
27000 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
27010 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
27020 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27030 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
27040 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
27050 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
27060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27070 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27080 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
27090 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
270a0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
270b0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
270c0 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
270d0 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
270e0 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
270f0 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
27100 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
27110 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27120 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
27130 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
27140 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
27150 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
27160 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
27170 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
27180 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
27190 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
271a0 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
271b0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
271c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
271d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
271e0 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
271f0 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
27200 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
27210 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
27220 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
27230 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
27240 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
27250 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
27260 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
27270 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
27280 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
27290 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
272a0 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
272b0 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
272c0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
272d0 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
272e0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
272f0 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
27300 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
27310 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
27320 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
27330 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
27340 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
27350 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
27360 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
27370 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
27380 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
27390 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
273a0 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
273b0 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
273c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
273d0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
273e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
273f0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
27400 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
27410 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
27420 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
27430 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
27440 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
27450 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27460 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
27470 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
27480 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
27490 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
274a0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
274b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
274c0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
274d0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
274e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
274f0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
27500 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
27510 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
27520 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
27530 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
27540 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
27550 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
27560 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
27570 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
27580 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
27590 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
275a0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
275b0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
275c0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
275d0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
275e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
275f0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
27600 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
27610 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
27620 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
27630 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
27640 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
27650 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
27660 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
27670 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
27680 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
27690 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
276a0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
276b0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
276c0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
276d0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
276e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
276f0 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
27700 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
27710 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
27720 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
27730 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
27740 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
27750 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
27760 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
27770 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
27780 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27790 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
277a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
277b0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
277c0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
277d0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
277e0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
277f0 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
27800 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
27810 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
27820 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27830 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
27840 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
27850 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
27860 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
27870 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27880 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
27890 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
278a0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
278b0 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
278c0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
278d0 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
278e0 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
278f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
27900 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
27910 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
27920 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
27930 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
27940 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
27950 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
27960 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
27970 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
27980 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
27990 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
279a0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
279b0 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
279c0 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
279d0 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
279e0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
279f0 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
27a00 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
27a10 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
27a20 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
27a30 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
27a40 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
27a50 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
27a60 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
27a70 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
27a80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
27a90 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
27aa0 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
27ab0 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
27ac0 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
27ad0 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
27ae0 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
27af0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
27b00 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
27b10 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
27b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
27b30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
27b40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27b50 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
27b60 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
27b70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
27b80 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
27b90 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
27ba0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
27bb0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
27bc0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27bd0 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
27be0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
27bf0 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
27c00 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
27c10 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27c20 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
27c30 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
27c40 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
27c50 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27c60 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
27c70 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27c80 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
27c90 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
27ca0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
27cb0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
27cc0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27cd0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
27ce0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
27cf0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
27d00 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
27d10 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
27d20 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
27d30 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
27d40 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
27d50 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
27d60 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
27d70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
27d80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27d90 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27da0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
27db0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27dc0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27dd0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
27de0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
27df0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
27e00 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
27e10 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
27e20 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
27e30 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
27e40 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
27e50 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27e60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27e70 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
27e80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27e90 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27eb0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27ec0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27ed0 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27ee0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27ef0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
27f00 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27f10 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27f20 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
27f30 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
27f40 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
27f50 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27f60 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
27f70 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
27f80 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27f90 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27fa0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27fb0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27fc0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27fd0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27ff0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
28000 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
28010 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
28020 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
28030 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
28040 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
28050 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
28060 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
28070 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
28080 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
28090 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
280a0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
280b0 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
280c0 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
280d0 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
280e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
280f0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
28100 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
28110 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
28120 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
28130 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
28140 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
28150 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
28160 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
28170 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
28180 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
28190 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
281a0 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
281b0 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
281c0 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
281d0 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
281e0 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
281f0 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
28200 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
28210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28220 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
28230 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
28240 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
28250 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
28260 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
28270 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
28280 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
28290 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
282a0 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
282b0 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
282c0 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
282d0 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
282e0 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
282f0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
28300 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
28310 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
28320 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
28330 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
28340 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
28350 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
28360 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
28370 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
28380 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
28390 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
283a0 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
283b0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
283c0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
283d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
283e0 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
283f0 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
28400 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
28410 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
28420 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
28430 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
28440 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
28450 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
28460 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
28470 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
28480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28490 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
284a0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
284b0 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
284e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
284f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
28500 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
28510 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
28520 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
28530 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
28540 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
28550 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
28560 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
28570 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28580 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
28590 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
285a0 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
285b0 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
285c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
285d0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
285e0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
285f0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
28600 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
28610 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
28620 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
28630 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
28640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
28650 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
28660 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
28670 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
28680 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
28690 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
286a0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
286b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
286c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
286d0 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
286e0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
286f0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
28700 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
28710 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
28720 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
28730 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
28740 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
28750 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
28760 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
28770 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
28780 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
28790 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
287a0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
287b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
287c0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
287d0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
287e0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
287f0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
28800 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
28810 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
28820 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
28830 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
28840 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
28850 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
28860 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
28870 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
28880 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
28890 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
288a0 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
288b0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
288c0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
288d0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
288e0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
288f0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
28900 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
28910 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
28920 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
28930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
28940 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
28950 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
28960 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
28970 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
28980 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
28990 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
289a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
289b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
289c0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
289d0 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
289e0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
289f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
28a00 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
28a10 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
28a20 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
28a30 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
28a40 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
28a50 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
28a60 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
28a70 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
28a80 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
28a90 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
28aa0 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
28ab0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
28ac0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
28ad0 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
28ae0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
28af0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
28b00 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
28b10 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
28b20 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
28b30 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
28b40 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
28b50 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
28b60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28b70 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
28b80 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
28b90 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
28ba0 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
28bb0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
28bc0 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28bd0 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
28be0 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
28bf0 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
28c00 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
28c10 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
28c20 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
28c30 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
28c40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
28c50 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
28c60 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
28c70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
28c80 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
28c90 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
28ca0 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
28cb0 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
28cc0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28cd0 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
28ce0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
28cf0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
28d00 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28d10 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
28d20 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
28d30 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28d40 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
28d50 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
28d60 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
28d70 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
28d80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28da0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
28db0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
28dc0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28dd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28de0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
28df0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
28e00 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
28e10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
28e20 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
28e30 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
28e40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28e50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28e60 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
28e70 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
28e80 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28e90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28ea0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28eb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28ec0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28ed0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28ee0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28ef0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
28f00 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28f10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28f20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
28f30 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
28f40 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
28f50 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28f60 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
28f70 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
28f80 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28f90 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28fa0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28fb0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28fc0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28fd0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28fe0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28ff0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29000 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
29010 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
29020 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
29030 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
29040 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
29050 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
29060 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
29070 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
29080 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
29090 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
290a0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
290b0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
290c0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
290d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
290e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
290f0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
29100 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
29110 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
29120 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
29130 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
29140 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
29150 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
29160 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
29170 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29180 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
29190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
291a0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
291b0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
291c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
291d0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
291e0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
291f0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
29200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
29210 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
29220 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
29230 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
29240 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29250 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29260 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
29270 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
29280 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
29290 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
292a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
292b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
292c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
292d0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
292e0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
292f0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
29300 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
29310 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
29320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29330 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29340 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29350 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
29360 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
29370 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
29380 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29390 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
293a0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
293b0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
293c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
293d0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
293e0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
293f0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
29400 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
29410 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
29420 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
29430 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
29440 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
29450 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
29460 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
29470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29490 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
294a0 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
294b0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
294c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
294d0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
294e0 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
294f0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
29500 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
29510 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
29520 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
29530 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
29540 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
29550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29560 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29580 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
29590 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
295a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
295b0 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
295c0 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
295d0 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
295e0 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
295f0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
29600 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
29610 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
29620 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
29630 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
29640 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
29650 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
29660 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
29670 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
29680 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
29690 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
296a0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
296b0 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
296c0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
296d0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
296e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
296f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
29700 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
29710 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
29720 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
29730 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
29740 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
29750 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
29760 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
29770 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
29780 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
29790 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
297a0 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
297b0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
297c0 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
297d0 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
297e0 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
297f0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
29800 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
29810 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
29820 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
29830 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
29840 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
29850 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
29860 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
29870 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
29880 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
29890 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
298a0 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
298b0 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
298c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
298d0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
298e0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
298f0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
29900 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
29910 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
29920 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29930 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
29940 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
29950 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
29960 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
29970 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
29980 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
29990 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
299a0 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
299b0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
299c0 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
299d0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
299e0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
299f0 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
29a00 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
29a10 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
29a20 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
29a30 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
29a40 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
29a50 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
29a60 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
29a70 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
29a80 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
29a90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
29aa0 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
29ab0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
29ac0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
29ad0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
29ae0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
29af0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
29b00 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
29b10 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
29b20 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
29b30 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
29b40 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
29b50 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
29b60 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
29b70 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
29b80 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
29b90 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
29ba0 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
29bb0 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
29bc0 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
29bd0 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
29be0 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
29bf0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
29c00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
29c10 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
29c20 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
29c30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29c40 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
29c50 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
29c60 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29c70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
29c80 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
29c90 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
29ca0 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
29cb0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29cc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29cd0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
29ce0 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
29cf0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
29d00 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
29d10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29d40 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
29d50 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
29d60 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
29d70 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
29d80 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
29d90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
29da0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29db0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29dc0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29dd0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
29de0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
29df0 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
29e00 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
29e10 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
29e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
29e30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29e40 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74   || pList->pDirt
29e50 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
29e60 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
29e70 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
29e80 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
29e90 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
29ea0 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
29eb0 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
29ec0 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
29ed0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
29ee0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
29ef0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
29f00 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
29f10 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
29f20 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
29f30 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
29f40 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
29f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29f60 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
29f70 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
29f80 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
29f90 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
29fa0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
29fb0 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
29fc0 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
29fd0 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
29fe0 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
29ff0 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
2a000 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
2a010 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
2a020 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2a030 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2a040 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2a050 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a060 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67  E_OK .   && pPag
2a070 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70  er->dbHintSize<p
2a080 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20  Pager->dbSize.  
2a090 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
2a0a0 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  ty || pList->pgn
2a0b0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  o>pPager->dbHint
2a0c0 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73  Size).  ){.    s
2a0d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
2a0e0 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
2a0f0 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
2a100 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
2a110 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
2a120 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2a130 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
2a140 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
2a150 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
2a160 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2a170 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
2a180 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
2a190 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
2a1a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2a1b0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2a1c0 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
2a1d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2a1e0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
2a1f0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
2a200 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
2a210 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
2a220 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
2a230 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
2a240 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
2a250 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
2a260 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
2a270 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
2a280 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
2a290 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
2a2a0 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
2a2b0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
2a2c0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
2a2d0 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
2a2e0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
2a2f0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
2a300 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
2a310 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
2a320 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
2a330 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
2a340 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2a350 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
2a360 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
2a370 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2a380 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
2a390 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
2a3a0 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
2a3b0 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
2a3c0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
2a3d0 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
2a3e0 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
2a3f0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
2a400 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
2a430 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
2a440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2a450 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2a460 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2a470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
2a480 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
2a490 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
2a4a0 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
2a4b0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
2a4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2a4d0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
2a4e0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
2a4f0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
2a500 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a510 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a  _BKPT, pData);..
2a520 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
2a530 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
2a540 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2a550 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2a560 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
2a570 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2a580 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
2a590 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
2a5a0 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
2a5b0 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
2a5c0 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
2a5d0 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
2a5e0 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
2a5f0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2a600 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
2a610 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
2a620 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
2a630 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a640 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
2a650 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
2a660 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2a670 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2a680 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2a690 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
2a6a0 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
2a6b0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2a6c0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2a6d0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2a6e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2a6f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
2a700 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2a710 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
2a720 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2a730 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
2a740 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
2a750 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
2a760 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
2a770 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2a780 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
2a790 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2a7a0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
2a7b0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
2a7c0 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
2a7d0 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
2a7e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
2a7f0 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
2a800 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a830 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
2a840 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
2a850 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2a860 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
2a870 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2a880 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2a890 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2a8a0 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
2a8b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a8c0 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
2a8d0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
2a8e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2a8f0 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
2a900 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
2a910 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2a920 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
2a930 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
2a940 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2a950 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
2a960 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
2a970 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2a980 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2a990 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
2a9a0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
2a9b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
2a9c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a9d0 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
2a9e0 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
2a9f0 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
2aa00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
2aa10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2aa20 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
2aa30 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2aa40 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
2aa50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2aa60 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
2aa70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2aa80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2aa90 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
2aaa0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2aab0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
2aac0 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f  flags =  SQLITE_
2aad0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2aae0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2aaf0 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c  ADWRITE .      |
2ab00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2ab10 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
2ab20 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  N_EXCLUSIVE .   
2ab30 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2ab40 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
2ab50 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69      int nStmtSpi
2ab60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
2ab70 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
2ab80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2ab90 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2aba0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2abb0 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2abc0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2abd0 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c        nStmtSpill
2abe0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2abf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2ac00 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2ac10 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72  >pVfs, 0, pPager
2ac20 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  ->sjfd, flags, n
2ac30 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a  StmtSpill);.  }.
2ac40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ac50 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2ac60 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2ac70 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2ac80 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2ac90 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2aca0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2acb0 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2acc0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2acd0 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2ace0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2acf0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2ad00 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2ad10 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2ad20 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2ad30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2ad40 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2ad50 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2ad60 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2ad70 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2ad80 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2ad90 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2ada0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2adb0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2adc0 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2add0 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2ade0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2adf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2ae00 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2ae10 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2ae20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ae30 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2ae40 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2ae50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2ae60 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2ae70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2ae80 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2ae90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2aea0 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2aeb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2aec0 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2aed0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2aee0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2aef0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2af00 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2af10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2af20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2af30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2af40 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2af50 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2af60 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2af70 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2af80 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2af90 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2afa0 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2afb0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2afc0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2afd0 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2afe0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2aff0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2b000 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2b010 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2b020 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2b030 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2b040 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2b050 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2b060 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2b070 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2b080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b090 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2b0a0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2b0b0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2b0c0 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2b0d0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2b0e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2b0f0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2b100 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2b110 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2b120 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2b130 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b140 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a  _BKPT, pData2);.
2b150 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2b160 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2b170 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2b180 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b190 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2b1a0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2b1b0 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2b1c0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2b1d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2b1e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b1f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b200 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2b210 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2b220 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2b230 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2b240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b250 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2b260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2b270 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2b280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b290 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2b2a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2b2b0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2b2c0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2b2d0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2b2e0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2b2f0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2b300 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67  ageIfRequired(Pg
2b310 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
2b320 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2b330 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65  e(pPg) ){.    re
2b340 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50  turn subjournalP
2b350 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
2b360 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2b370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
2b380 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b390 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2b3a0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
2b3b0 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
2b3c0 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
2b3d0 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
2b3e0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2b3f0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
2b400 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
2b410 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
2b420 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
2b430 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
2b440 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
2b450 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
2b460 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
2b470 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2b480 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
2b490 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
2b4a0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
2b4b0 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
2b4c0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2b4d0 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
2b4e0 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
2b4f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
2b500 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
2b510 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2b520 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
2b530 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
2b540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b550 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
2b560 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
2b570 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
2b580 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b590 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
2b5a0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
2b5b0 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
2b5c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b5d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2b5e0 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
2b5f0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2b600 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
2b610 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
2b620 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2b630 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2b640 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2b650 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
2b660 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
2b670 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2b680 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
2b690 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
2b6a0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
2b6b0 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
2b6c0 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
2b6d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2b6e0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
2b6f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2b700 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2b710 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
2b720 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2b730 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
2b740 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
2b750 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2b760 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
2b770 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
2b780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b790 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
2b7a0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
2b7b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
2b7c0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
2b7d0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
2b7e0 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69  tSpill NOSYNC bi
2b7f0 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  t is set during 
2b800 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
2b810 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
2b820 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
2b830 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
2b840 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
2b850 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
2b860 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
2b870 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2b880 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
2b890 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
2b8a0 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
2b8b0 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
2b8c0 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
2b8d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2b8e0 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42  doNotSpill ROLLB
2b8f0 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73  ACK and OFF bits
2b900 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
2b910 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a  che spilling.  *
2b920 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * regardless of 
2b930 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2b940 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
2b950 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
2b960 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f  during.  ** a ro
2b970 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65  llback or by use
2b980 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65  r request, respe
2b990 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ctively..  **.  
2b9a0 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61  ** Spilling is a
2b9b0 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77  lso prohibited w
2b9c0 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  hen in an error 
2b9d0 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74  state since that
2b9e0 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64   could.  ** lead
2b9f0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
2ba00 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68  ruption.   In th
2ba10 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
2ba20 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a  entation it .  *
2ba30 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
2ba40 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
2ba50 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
2ba60 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
2ba70 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68  eFlag==3.  ** wh
2ba80 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
2ba90 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
2baa0 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2bab0 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2bac0 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
2bad0 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
2bae0 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
2baf0 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
2bb00 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
2bb10 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
2bb20 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
2bb30 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
2bb40 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
2bb50 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2bb60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2bb70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2bb80 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28  _OK;.  testcase(
2bb90 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2bba0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2bbb0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65  ROLLBACK );.  te
2bbc0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2bbd0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2bbe0 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20  LLFLAG_OFF );.  
2bbf0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2bc00 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2bc10 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
2bc20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2bc30 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26  >doNotSpill.   &
2bc40 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  & ((pPager->doNo
2bc50 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46  tSpill & (SPILLF
2bc60 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49  LAG_ROLLBACK|SPI
2bc70 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a  LLFLAG_OFF))!=0.
2bc80 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
2bc90 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
2bca0 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b  D_SYNC)!=0).  ){
2bcb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2bcc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2bcd0 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2bce0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2bcf0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2bd00 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
2bd10 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
2bd20 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
2bd30 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75  . */.    rc = su
2bd40 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2bd50 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20  quired(pPg); .  
2bd60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bd70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2bd80 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
2bd90 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
2bda0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2bdb0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
2bdc0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2bdd0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
2bde0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
2bdf0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2be00 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
2be10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2be20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
2be30 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
2be40 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2be50 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
2be60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2be70 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2be80 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2be90 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2bea0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2beb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bec0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2bed0 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2bee0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2bef0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2bf00 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2bf10 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2bf20 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2bf30 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2bf40 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2bf50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bf60 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2bf70 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2bf80 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2bf90 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2bfa0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2bfb0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2bfc0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2bfd0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2bfe0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2bff0 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  ); .}../*.** Flu
2c000 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e  sh all unreferen
2c010 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73 20  ced dirty pages 
2c020 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
2c030 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73  sqlite3PagerFlus
2c040 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  h(Pager *pPager)
2c050 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61  {.  int rc = pPa
2c060 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2c070 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
2c080 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d    PgHdr *pList =
2c090 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2c0a0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2c0b0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73  pPCache);.    as
2c0c0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2c0d0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2c0e0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72   );.    while( r
2c0f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c100 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50  pList ){.      P
2c110 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
2c120 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
2c130 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52     if( pList->nR
2c140 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
2c150 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73   rc = pagerStres
2c160 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c  s((void*)pPager,
2c170 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
2c180 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
2c190 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
2c1a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c1b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2c1c0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2c1d0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2c1e0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2c1f0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2c200 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2c210 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2c220 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2c230 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2c240 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2c250 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2c260 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2c270 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2c280 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c290 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2c2a0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2c2b0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2c2c0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2c2d0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2c2e0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2c2f0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2c300 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2c310 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2c320 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2c330 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2c340 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2c350 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2c360 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2c370 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2c380 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2c390 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2c3a0 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2c3b0 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2c3c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2c3d0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2c3e0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2c3f0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2c400 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2c410 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2c420 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2c430 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2c440 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2c450 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2c460 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2c470 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2c480 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2c490 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2c4a0 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2c4b0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2c4c0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2c4d0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2c4e0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2c4f0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2c500 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2c510 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2c520 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2c530 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2c540 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2c550 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2c560 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2c570 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2c580 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2c590 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2c5a0 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2c5b0 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2c5c0 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2c5d0 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2c5e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2c5f0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2c600 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2c610 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2c620 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2c630 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2c640 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2c650 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2c660 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2c670 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2c680 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2c690 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2c6a0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2c6b0 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2c6c0 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2c6d0 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2c6e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2c6f0 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2c700 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2c710 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2c720 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2c730 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2c740 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2c750 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2c760 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2c770 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2c790 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2c7a0 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2c7b0 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2c7c0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2c7d0 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2c7e0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c7f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c800 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2c810 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2c820 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2c830 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2c840 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2c850 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2c860 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2c870 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2c880 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2c890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c8a0 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2c8b0 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2c8c0 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2c8d0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2c8e0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2c8f0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2c900 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2c910 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2c920 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2c930 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2c940 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2c950 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2c960 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2c970 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2c980 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2c990 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2c9a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c9b0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2c9c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2c9d0 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2c9e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2c9f0 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2ca00 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2ca10 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2ca20 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2ca30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2ca40 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2ca50 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2ca60 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2ca70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ca80 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2ca90 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2caa0 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2cab0 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2cac0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2cad0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2cae0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2caf0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2cb00 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2cb10 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2cb20 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2cb30 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2cb40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2cb50 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2cb60 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2cb70 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2cb80 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2cb90 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2cba0 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2cbb0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2cbc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2cbd0 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2cbe0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2cbf0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2cc00 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2cc10 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2cc20 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2cc30 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2cc40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2cc50 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2cc60 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2cc70 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2cc80 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2cc90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2cca0 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2ccb0 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2ccc0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2ccd0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2cce0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2ccf0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2cd00 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2cd10 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2cd20 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2cd30 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2cd40 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2cd50 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2cd60 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2cd70 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2cd80 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2cd90 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2cda0 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2cdb0 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2cdc0 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2cdd0 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2cde0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2cdf0 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2ce00 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2ce10 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2ce20 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2ce30 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2ce40 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2ce50 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2ce60 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2ce70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2ce80 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2ce90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cea0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2ceb0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2cec0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2ced0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2cee0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2cef0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2cf00 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2cf10 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2cf20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2cf30 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2cf40 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2cf50 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2cf60 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2cf70 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2cf80 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2cf90 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2cfa0 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2cfb0 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2cfc0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2cfd0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2cfe0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2cff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2d000 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2d010 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2d020 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2d030 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2d040 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2d050 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2d060 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2d070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d080 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d090 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2d0a0 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2d0b0 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2d0c0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2d0d0 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2d0e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d0f0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2d100 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2d110 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2d120 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2d130 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2d140 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2d150 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2d160 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2d170 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2d180 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2d190 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2d1a0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2d1b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2d1c0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2d1d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2d1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2d1f0 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2d200 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2d210 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2d220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d230 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2d240 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2d250 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2d260 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2d270 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2d280 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2d290 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2d2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2d2b0 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2d2c0 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2d2d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2d2e0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2d2f0 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2d300 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2d310 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2d320 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2d330 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2d340 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2d350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2d360 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2d370 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2d380 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2d390 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2d3a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2d3b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2d3c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d3d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d3e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2d3f0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d400 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2d410 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2d420 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2d430 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2d440 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2d450 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2d460 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2d470 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2d480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d490 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2d4a0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2d4b0 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2d4c0 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2d4d0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2d4e0 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2d4f0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2d500 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2d510 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2d520 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2d530 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2d540 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2d550 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2d560 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2d570 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2d580 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2d590 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2d5a0 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2d5b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2d5c0 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2d5d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2d5e0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2d5f0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2d600 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2d610 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2d620 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2d630 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2d650 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2d660 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2d670 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2d680 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2d690 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2d6a0 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2d6b0 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2d6c0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2d6d0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d6e0 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2d6f0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2d700 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2d710 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2d720 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2d730 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2d740 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2d750 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2d760 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2d770 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2d780 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2d790 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2d7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2d7b0 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2d7c0 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2d7d0 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2d7e0 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2d7f0 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2d800 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2d810 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2d820 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2d830 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2d840 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2d850 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2d860 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2d870 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2d880 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2d890 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2d8a0 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2d8b0 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2d8c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d8d0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d8e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d8f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2d900 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2d910 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2d920 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2d930 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2d940 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2d950 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2d960 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2d970 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2d980 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d990 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2d9a0 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2d9b0 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2d9c0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2d9d0 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2d9e0 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2d9f0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2da00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2da10 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2da20 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2da30 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2da40 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2da50 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2da60 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2da70 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2da80 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2da90 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2daa0 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2dab0 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2dac0 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2dad0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2dae0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2daf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2db00 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2db10 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2db20 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2db30 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2db40 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2db50 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2db60 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2db70 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2db80 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2db90 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2dba0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2dbb0 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2dbc0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2dbd0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2dbe0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2dbf0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2dc00 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2dc10 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2dc20 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2dc30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2dc40 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2dc50 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2dc60 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2dc70 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2dc80 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2dc90 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2dca0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2dcb0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2dcc0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2dcd0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2dce0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dcf0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2dd00 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2dd10 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2dd20 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2dd30 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2dd40 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2dd50 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2dd60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2dd70 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2dd80 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2dd90 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2dda0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2ddb0 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2ddc0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2ddd0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2dde0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2ddf0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2de00 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2de10 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2de30 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2de40 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2de50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2de60 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2de70 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2de80 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2de90 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2dea0 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2deb0 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2dec0 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2ded0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2dee0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2def0 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2df00 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2df10 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2df20 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2df30 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2df40 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2df50 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2df60 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2df70 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2df80 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2df90 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2dfa0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2dfb0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2dfc0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2dfd0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2dfe0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2dff0 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2e000 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2e010 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2e020 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2e030 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2e040 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2e050 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e070 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2e080 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2e090 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2e0a0 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >fd);.      if( 
2e0b0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2e0c0 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2e0d0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2e0e0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2e0f0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2e100 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2e110 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e120 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
2e130 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2e140 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2e150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2e160 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2e170 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2e180 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2e190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2e1a0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2e1b0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e1c0 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2e1d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e1e0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2e1f0 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2e200 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2e210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e220 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2e230 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2e240 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
2e250 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2e260 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e270 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2e280 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2e290 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2e2a0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2e2b0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2e2c0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2e2d0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2e2e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e2f0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2e300 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2e310 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2e320 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2e330 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2e340 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2e350 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2e360 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2e370 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50               szP
2e390 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2e3a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e3c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
2e3d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2e3e0 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  oLock = sqlite3_
2e3f0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2e400 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c  ename, "nolock",
2e410 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28   0);.      if( (
2e420 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
2e430 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30  AP_IMMUTABLE)!=0
2e440 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2e450 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2e460 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74  Filename, "immut
2e470 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20  able", 0) ){.   
2e480 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20         vfsFlags 
2e490 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2e4a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
2e4b0 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65     goto act_like
2e4c0 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20  _temp_file;.    
2e4d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2e4e0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2e4f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2e500 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2e510 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2e520 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2e530 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2e540 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2e550 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2e560 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2e570 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2e580 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2e590 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2e5a0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2e5b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2e5c0 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2e5d0 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2e5e0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2e5f0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2e600 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2e610 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2e620 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2e630 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2e640 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2e650 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2e660 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2e670 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rnal..    **.   
2e680 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2e690 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69  also runs for fi
2e6a0 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d  les marked as im
2e6b0 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20  mutable..    */ 
2e6c0 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66  .act_like_temp_f
2e6d0 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c  ile:.    tempFil
2e6e0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2e6f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2e700 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a  R_READER;     /*
2e710 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65   Pretend we alre
2e720 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20  ady have a lock 
2e730 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
2e740 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2e750 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65  _LOCK;    /* Pre
2e760 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45  tend we are in E
2e770 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f  XCLUSIVE mode */
2e780 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  .    pPager->noL
2e790 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ock = 1;        
2e7a0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2e7b0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2e7c0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2e7d0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2e7e0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2e7f0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2e800 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2e810 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2e820 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2e830 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2e840 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2e850 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2e860 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2e870 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2e880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e890 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2e8a0 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2e8b0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2e8c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2e8d0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2e8e0 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2e8f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2e900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2e910 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2e920 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2e930 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66   object. */.  if
2e940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e950 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2e960 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2e970 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2e980 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72  8(nExtra);.    r
2e990 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2e9a0 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2e9b0 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2e9c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e9d0 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2e9e0 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2e9f0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2ea00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2ea10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2ea20 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2ea30 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2ea40 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2ea50 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2ea60 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2ea70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ea80 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2ea90 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2eaa0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2eab0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2eac0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2ead0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2eae0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2eaf0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2eb00 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2eb10 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2eb20 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2eb30 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2eb40 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2eb50 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2eb60 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2eb70 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2eb80 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2eb90 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2eba0 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2ebb0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2ebc0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2ebd0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2ebe0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2ebf0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2ec00 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2ec10 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ec20 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2ec30 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ec40 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2ec50 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2ec60 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2ec70 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2ec80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2ec90 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2eca0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2ecb0 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2ecc0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ecd0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2ece0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2ecf0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2ed00 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2ed10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2ed20 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2ed30 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2ed40 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2ed50 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ed60 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2ed70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2ed80 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2ed90 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2eda0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2edb0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2edc0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2edd0 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2ede0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2edf0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2ee00 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2ee10 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2ee20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ee30 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2ee40 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2ee50 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2ee60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2ee70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2ee80 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2ee90 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2eea0 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
2eeb0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2eec0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2eed0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2eee0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2eef0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2ef00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ef10 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2ef20 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2ef30 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2ef40 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2ef50 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
2ef60 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
2ef70 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2ef80 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2ef90 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
2efa0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
2efb0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2efc0 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54  MAL | WAL_SYNC_T
2efd0 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20  RANSACTIONS;.   
2efe0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2eff0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2f000 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
2f010 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2f020 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
2f030 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2f040 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
2f050 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
2f060 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
2f070 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
2f080 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
2f090 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
2f0a0 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
2f0b0 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
2f0c0 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
2f0d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2f0e0 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
2f0f0 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
2f100 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2f110 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
2f120 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2f130 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2f140 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2f150 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
2f160 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
2f170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f180 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2f190 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
2f1a0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
2f1b0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
2f1c0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f1d0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
2f1e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2f1f0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
2f200 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
2f210 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
2f220 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
2f230 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
2f240 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a  .  /* pPager->sz
2f250 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
2f260 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20  FAULT_MMAP_SIZE 
2f270 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62  // will be set b
2f280 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20  y btree.c */..  
2f290 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
2f2a0 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
2f2b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65  TE_OK;.}.../* Ve
2f2c0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
2f2d0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
2f2e0 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f  not be deleted o
2f2f0 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72  r renamed out fr
2f300 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20  om.** under the 
2f310 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53  pager.  Return S
2f320 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
2f330 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69 6c  database is stil
2f340 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a  l were it ought.
2f350 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b  ** to be on disk
2f360 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
2f370 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f  ro (SQLITE_READO
2f380 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73  NLY_DBMOVED or s
2f390 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  ome other error.
2f3a0 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c  ** code from sql
2f3b0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29 20  ite3OsAccess()) 
2f3c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2f3d0 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67  has gone missing
2f3e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f3f0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
2f400 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
2f410 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65  {.  int bHasMove
2f420 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  d = 0;.  int rc;
2f430 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2f440 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72  tempFile ) retur
2f450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
2f460 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2f470 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2f480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2f490 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  t( pPager->zFile
2f4a0 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e  name && pPager->
2f4b0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a  zFilename[0] );.
2f4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f4d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
2f4e0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
2f4f0 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20  CNTL_HAS_MOVED, 
2f500 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69  &bHasMoved);.  i
2f510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
2f520 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a  TFOUND ){.    /*
2f530 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45   If the HAS_MOVE
2f540 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69  D file-control i
2f550 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  s unimplemented,
2f560 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2f570 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73   file.    ** has
2f580 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e   not been moved.
2f590 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68 69    That is the hi
2f5a0 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f  storical behavio
2f5b0 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69  r of SQLite: pri
2f5c0 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72  or to.    ** ver
2f5d0 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e  sion 3.8.3, it n
2f5e0 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a  ever checked */.
2f5f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f600 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
2f610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f620 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20   bHasMoved ){.  
2f630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
2f640 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a  ADONLY_DBMOVED;.
2f650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f660 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
2f670 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2f680 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2f690 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2f6a0 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2f6b0 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2f6c0 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2f6d0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2f6e0 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2f6f0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2f700 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2f710 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2f720 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2f730 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2f740 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2f750 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2f760 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2f770 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2f780 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2f790 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2f7a0 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2f7b0 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2f7c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2f7d0 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2f7e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2f7f0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2f800 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2f810 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2f820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2f830 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2f840 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2f850 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2f860 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2f870 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2f880 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2f890 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f8a0 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2f8b0 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2f8c0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2f8d0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2f8e0 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2f8f0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2f900 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2f910 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2f920 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2f930 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2f940 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2f950 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2f960 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2f970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f980 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2f990 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2f9a0 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2f9b0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2f9c0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2f9d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2f9e0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2f9f0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2fa00 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2fa10 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2fa20 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2fa30 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2fa40 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2fa50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2fa60 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2fa70 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2fa80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2fa90 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2faa0 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2fab0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2fac0 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2fad0 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2fae0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2faf0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2fb00 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2fb10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2fb20 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2fb30 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2fb40 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2fb50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2fb60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2fb70 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2fb80 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2fb90 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2fba0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2fbb0 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2fbc0 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2fbd0 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2fbe0 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2fbf0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2fc00 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2fc10 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2fc20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2fc30 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2fc40 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2fc50 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2fc60 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2fc70 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2fc80 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2fc90 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2fca0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2fcb0 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2fcc0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2fcd0 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2fce0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2fcf0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2fd00 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2fd10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2fd20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2fd30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2fd40 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2fd50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2fd60 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2fd70 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2fd80 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2fd90 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2fda0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2fdb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2fdc0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2fdd0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2fde0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2fdf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2fe00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2fe10 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2fe20 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2fe30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2fe40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2fe50 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2fe60 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2fe70 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2fe80 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2fe90 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2fea0 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2feb0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2fec0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2fed0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2fee0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2fef0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2ff00 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2ff10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ff20 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2ff30 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2ff40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ff50 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2ff60 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2ff70 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2ff80 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2ff90 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2ffa0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2ffb0 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2ffc0 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2ffd0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2ffe0 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2fff0 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
30000 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
30010 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
30020 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
30030 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
30040 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
30050 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
30060 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
30070 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
30080 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
30090 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
300a0 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
300b0 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
300c0 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
300d0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
300e0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
300f0 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
30100 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
30110 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
30120 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
30130 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
30140 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
30150 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
30160 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
30170 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
30180 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
30190 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
301a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
301b0 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
301c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
301d0 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
301e0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
301f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30200 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
30210 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
30220 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
30230 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
30240 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  le==0 );.      r
30250 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
30260 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
30270 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
30280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30290 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
302a0 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72   database is zer
302b0 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c  o pages in size,
302c0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
302d0 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a   either (1) the.
302e0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
302f0 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20  al is a remnant 
30300 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74  from a prior dat
30310 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
30320 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20  ame name where. 
30330 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
30340 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20  tabase file but 
30350 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
30360 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20  was deleted, or 
30370 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  (2) the initial.
30380 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
30390 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75  action that popu
303a0 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61  lates a new data
303b0 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f  base is being ro
303c0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20  lled back..     
303d0 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20     ** In either 
303e0 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  case, the journa
303f0 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65  l file can be de
30400 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c  leted.  However,
30410 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20   take care.     
30420 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c     ** not to del
30430 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
30440 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c  file if it is al
30450 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74  ready open due t
30460 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  o.        ** jou
30470 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
30480 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  T..        */.  
30490 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
304a0 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20  =0 && !jrnlOpen 
304b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
304c0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
304d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
304e0 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
304f0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
30500 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
30510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30520 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
30530 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
30540 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
30550 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30560 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
30570 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
30580 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
30590 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
305a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
305b0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
305c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
305d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
305e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
305f0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30600 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
30610 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
30620 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
30630 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
30640 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
30650 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
30660 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
30670 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
30680 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
30690 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
306a0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
306b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
306c0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
306d0 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
306e0 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
306f0 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
30700 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
30710 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
30720 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
30730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30740 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
30760 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
30770 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
30780 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
30790 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
307a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
307b0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
307c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
307d0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
307e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
307f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30810 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
30820 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30840 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
30850 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
30860 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
30870 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30880 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
30890 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
308a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
308b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
308c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
308d0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
308e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
308f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
30900 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
30910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30920 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
30930 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
30940 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
30950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
30960 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
30970 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
30980 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
30990 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
309a0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
309b0 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
309c0 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65    ** it has a ze
309d0 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
309e0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
309f0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
30a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30a10 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
30a20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
30a30 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
30a40 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
30a50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
30a60 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
30a70 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
30a80 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
30a90 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
30aa0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
30ab0 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
30ac0 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
30ad0 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
30ae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
30af0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
30b00 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
30b10 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
30b20 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
30b30 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
30b40 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
30b50 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
30b60 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
30b70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
30b80 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
30b90 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
30ba0 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
30bb0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
30bc0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
30bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30be0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
30bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30c00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30c20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30c30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
30c40 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
30c50 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
30c60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
30c70 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
30c80 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
30c90 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66  erGet() until af
30ca0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
30cb0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
30cc0 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
30cd0 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
30ce0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
30cf0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
30d00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30d10 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
30d20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
30d30 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
30d40 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
30d50 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
30d60 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
30d70 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
30d80 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
30d90 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
30da0 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
30db0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
30dc0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
30dd0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
30de0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
30df0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
30e00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30e10 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
30e20 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
30e30 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
30e40 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
30e50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30e60 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
30e70 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
30e80 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
30e90 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
30ea0 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
30eb0 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
30ec0 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
30ed0 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
30ee0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
30ef0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
30f00 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
30f10 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
30f20 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
30f30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30f40 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
30f50 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
30f60 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
30f70 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
30f80 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
30f90 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
30fa0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
30fb0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
30fc0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
30fd0 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
30fe0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
30ff0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
31000 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
31010 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
31020 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
31030 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
31040 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31050 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
31060 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
31070 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
31080 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
31090 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
310a0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
310b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
310c0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
310d0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
310e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
310f0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
31100 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
31110 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
31120 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
31130 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
31140 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
31150 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
31160 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
31170 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
31180 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
31190 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
311a0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
311b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
311c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
311d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
311e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
311f0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
31200 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
31210 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
31220 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
31230 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
31240 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
31250 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
31260 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
31270 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
31280 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
31290 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
312a0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
312b0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
312c0 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
312d0 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
312e0 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  mode.  */.  asse
312f0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
31300 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
31310 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
31320 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
31330 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
31340 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
31350 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31360 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
31370 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31380 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
31390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
313a0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
313b0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
313c0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
313d0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
313e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
313f0 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
31400 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
31410 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31420 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
31430 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
31440 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
31450 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
31460 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31470 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
31480 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
31490 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
314a0 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
314b0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
314c0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
314d0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
314e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
314f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31500 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
31510 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  K || pPager->eLo
31520 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
31530 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   );.      goto f
31540 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
31550 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
31560 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
31570 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
31580 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
31590 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
315a0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
315b0 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
315c0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
315d0 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
315e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
315f0 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  er->eLock<=SHARE
31600 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
31610 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
31620 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74  al(pPager, &bHot
31630 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
31640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
31660 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31670 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f  }.    if( bHotJo
31680 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
31690 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
316a0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
316b0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
316c0 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  NLY_ROLLBACK;.  
316d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
316e0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
316f0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
31700 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
31710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31720 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
31730 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
31740 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
31750 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
31760 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
31770 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
31780 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
31790 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
317a0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
317b0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
317c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
317d0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
317e0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
317f0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
31800 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
31810 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
31820 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
31830 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
31840 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
31850 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
31860 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
31870 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
31880 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
31890 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
318a0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
318b0 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
318c0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
318d0 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
318e0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
318f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
31900 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
31910 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
31920 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
31930 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
31940 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
31950 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
31960 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31970 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
31980 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
31990 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
319a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
319b0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
319c0 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
319d0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
319e0 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
319f0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
31a00 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
31a10 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
31a20 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
31a30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
31a40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31a60 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31a70 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
31a80 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
31a90 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
31aa0 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
31ab0 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
31ac0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
31ad0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
31ae0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
31af0 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
31b00 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
31b10 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
31b20 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
31b30 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
31b40 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
31b50 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
31b60 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
31b70 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
31b80 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
31b90 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
31ba0 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
31bb0 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
31bc0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
31bd0 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
31be0 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
31bf0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
31c00 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
31c10 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
31c20 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
31c30 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
31c40 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
31c50 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
31c60 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
31c70 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
31c80 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
31c90 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
31ca0 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
31cb0 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
31cc0 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
31cd0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
31ce0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
31cf0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
31d00 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
31d10 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
31d20 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
31d30 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
31d40 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
31d50 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
31d60 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
31d70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31d80 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
31d90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31da0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
31db0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31dc0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
31dd0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
31de0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
31df0 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
31e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e10 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
31e20 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
31e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31e40 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
31e50 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
31e60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31e70 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
31e80 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
31e90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31eb0 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
31ec0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
31ed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
31ee0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
31ef0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
31f00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31f10 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
31f20 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
31f30 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
31f40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31f50 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
31f60 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31f70 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
31f80 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
31f90 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
31fa0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
31fb0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31fe0 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  & fout&SQLITE_OP
31ff0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
32000 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32010 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
32020 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
32030 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
32040 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
32050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32060 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20     }.      }. . 
32070 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
32080 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
32090 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
320a0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
320b0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
320c0 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
320d0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
320e0 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
320f0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
32100 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
32110 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
32120 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
32130 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
32140 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
32150 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65  cache.  Sync the
32160 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66   hot journal bef
32170 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20  ore playing.    
32180 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e    ** it back sin
32190 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ce the process t
321a0 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20  hat crashed and 
321b0 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75  left the hot jou
321c0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72  rnal.      ** pr
321d0 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73  obably did not s
321e0 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72  ync it and we ar
321f0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  e required to al
32200 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20  ways sync.      
32210 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ** the journal b
32220 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74  efore playing it
32230 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   back..      */.
32240 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
32250 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32260 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32280 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
32290 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
322a0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
322b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
322c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
322d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
322e0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21  ayback(pPager, !
322f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
32300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
32310 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
32320 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20  GER_OPEN;.      
32330 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
32340 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
32350 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
32360 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
32370 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
32380 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
32390 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
323a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
323b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
323c0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66  anch is taken if
323d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
323e0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
323f0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
32400 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   or roll back a 
32410 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c  hot-journal whil
32420 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
32430 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
32440 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
32450 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  r_unlock() routi
32460 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
32470 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
32480 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20  ng to unlock.   
32490 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65       ** the file
324a0 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20  . If the unlock 
324b0 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74  attempt fails, t
324c0 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  hen Pager.eLock 
324d0 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20  must be.        
324e0 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  ** set to UNKNOW
324f0 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20  N_LOCK (see the 
32500 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
32510 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20  e #define for . 
32520 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57         ** UNKNOW
32530 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72  N_LOCK above for
32540 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29   an explanation)
32550 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
32560 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65        ** In orde
32570 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75  r to get pager_u
32580 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68  nlock() to do th
32590 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53  is, set Pager.eS
325a0 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20  tate to.        
325b0 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e  ** PAGER_ERROR n
325c0 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ow. This is not 
325d0 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64  actually counted
325e0 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e   as a transition
325f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45  .        ** to E
32600 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68  RROR state in th
32610 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20  e state diagram 
32620 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
32630 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20  is file,.       
32640 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
32650 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  w that the same 
32660 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
32670 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79  lock() will very
32680 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72  .        ** shor
32690 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  tly transition t
326a0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
326b0 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74  to the OPEN stat
326c0 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20  e. Calling.     
326d0 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67     ** assert_pag
326e0 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64  er_state() would
326f0 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74   fail now, as it
32700 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70   should not be p
32710 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
32720 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f  ** to be in ERRO
32730 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65  R state when the
32740 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73  re are zero outs
32750 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20  tanding page .  
32760 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e        ** referen
32770 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ces..        */.
32780 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
32790 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
327a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
327b0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
327c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
327d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
327e0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ER_OPEN );.     
327f0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
32800 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
32810 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  LOCK).          
32820 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
32830 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
32840 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52  ager->eLock>SHAR
32850 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29  ED_LOCK).      )
32860 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
32870 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
32880 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61  le && pPager->ha
32890 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
328a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
328b0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
328c0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
328d0 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  ed then check to
328e0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
328f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
32900 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
32910 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
32920 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20  e has changed,. 
32930 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68       ** flush th
32940 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68 61  e cache.  The ha
32950 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
32960 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
32970 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
32980 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68   occurring on th
32990 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63 63  e very first acc
329a0 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69  ess to a file, i
329b0 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20  n order to save 
329c0 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
329d0 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71  e unnecessary sq
329e0 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63 61  lite3OsRead() ca
329f0 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 2d  ll at the start-
32a00 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  up..      **.   
32a10 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
32a20 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65 63  hanges are detec
32a30 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
32a40 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
32a50 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
32a60 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
32a70 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
32a80 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
32a90 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
32aa0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
32ab0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
32ac0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
32ad0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
32ae0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
32af0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
32b00 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
32b10 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
32b20 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
32b30 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
32b40 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
32b50 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
32b60 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
32b70 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
32b80 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
32b90 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
32ba0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
32bb0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
32bc0 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
32bd0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
32be0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
32bf0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
32c00 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20       Pgno nPage 
32c10 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
32c20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
32c30 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
32c40 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72  Vers)];..      r
32c50 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
32c60 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
32c70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32c80 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a   ) goto failed;.
32c90 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
32ca0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f  >0 ){.        IO
32cb0 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
32cc0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
32cd0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32ce0 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rs)));.        r
32cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
32d00 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
32d10 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
32d20 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
32d30 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
32d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
32d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
32d60 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
32d70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
32d80 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
32d90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32da0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
32db0 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
32dc0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
32dd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32de0 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
32df0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
32e00 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
32e10 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
32e20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
32e30 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
32e40 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;..        /* Un
32e50 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65  map the database
32e60 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73   file. It is pos
32e70 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72  sible that exter
32e80 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20  nal processes.  
32e90 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76        ** may hav
32ea0 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20  e truncated the 
32eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
32ec0 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20  d then extended 
32ed0 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20  it back.        
32ee0 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ** to its origin
32ef0 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68  al size while th
32f00 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e  is process was n
32f10 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63  ot holding a loc
32f20 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
32f30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
32f40 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67   may exist a Pag
32f50 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20  er.pMap mapping 
32f60 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20  that appears.   
32f70 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68       ** to be th
32f80 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74  e right size but
32f90 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
32fa0 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68   valid. Avoid th
32fb0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  is.        ** po
32fc0 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d  ssibility by unm
32fd0 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65  apping the db he
32fe0 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  re. */.        i
32ff0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
33000 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
33010 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
33020 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
33030 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
33040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33050 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
33060 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
33070 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
33080 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
33090 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
330a0 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
330b0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
330c0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
330d0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
330e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
330f0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
33100 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66  pPager);.#ifndef
33110 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
33120 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33130 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20  ger->pWal==0 || 
33140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33150 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
33160 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
33170 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
33180 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
33190 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
331a0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
331b0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
331c0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
331d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
331e0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  0 && pPager->eSt
331f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
33200 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
33210 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
33220 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
33230 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
33240 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
33250 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
33260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
33270 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
33280 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
33290 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
332a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
332b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
332c0 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
332d0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
332e0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
332f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73  .    pPager->has
33300 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d  HeldSharedLock =
33310 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
33320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
33330 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
33340 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
33350 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
33360 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
33370 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
33380 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
33390 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
333a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
333b0 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
333c0 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
333d0 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
333e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
333f0 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
33400 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
33410 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
33420 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
33430 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
33440 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
33450 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
33460 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
33470 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33480 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  if( pPager->nMma
33490 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69  pOut==0 && (sqli
334a0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
334b0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
334c0 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61  e)==0) ){.    pa
334d0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
334e0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
334f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
33500 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
33510 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
33520 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
33530 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
33540 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
33550 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
33560 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
33570 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
33580 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
33590 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
335a0 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
335b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
335c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
335d0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
335e0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
335f0 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
33600 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
33610 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
33620 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
33630 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
33640 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
33650 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
33660 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
33670 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
33680 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
33690 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
336a0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
336b0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
336c0 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
336d0 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
336e0 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
336f0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
33700 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
33710 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
33720 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
33730 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
33740 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
33750 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
33760 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
33770 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
33780 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
33790 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
337a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
337b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
337c0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
337d0 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
337e0 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
337f0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
33800 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
33810 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
33820 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
33830 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
33840 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
33850 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
33860 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
33870 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
33880 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
33890 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
338a0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
338b0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
338c0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
338d0 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
338e0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
338f0 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
33900 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
33910 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
33920 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
33930 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
33940 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
33950 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
33960 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
33970 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
33980 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
33990 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
339a0 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
339b0 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
339c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
339d0 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
339e0 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
339f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
33a00 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
33a10 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
33a20 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
33a30 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
33a40 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
33a50 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
33a60 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
33a70 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
33a80 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
33a90 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
33aa0 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
33ab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
33ac0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
33ad0 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
33ae0 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
33af0 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
33b00 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
33b10 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
33b20 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
33b30 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
33b40 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
33b50 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
33b60 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
33b70 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
33b80 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
33b90 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
33ba0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
33bb0 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
33bc0 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
33bd0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
33be0 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
33bf0 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
33c00 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
33c10 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
33c20 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
33c30 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
33c40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33c50 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
33c60 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
33c70 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
33c80 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
33c90 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
33ca0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
33cb0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
33cc0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
33cd0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
33ce0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
33cf0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
33d00 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
33d10 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
33d20 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
33d30 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
33d40 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
33d50 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
33d60 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
33d70 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
33d80 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
33d90 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
33da0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
33db0 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
33dc0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
33dd0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
33de0 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
33df0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
33e00 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
33e10 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
33e20 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
33e30 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
33e40 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
33e50 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
33e60 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
33e70 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
33e80 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
33e90 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
33ea0 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
33eb0 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
33ec0 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
33ed0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
33ee0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33ef0 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65 72  agerGet(.  Pager
33f00 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
33f10 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
33f20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33f30 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
33f40 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
33f50 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
33f60 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
33f70 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
33f80 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
33f90 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
33fa0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
33fb0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
33fc0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
33fd0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
33fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33ff0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
34000 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  ;.  u32 iFrame =
34010 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
34020 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
34030 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
34040 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  le */.  const in
34050 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66  t noContent = (f
34060 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
34070 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20  _NOCONTENT);..  
34080 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
34090 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
340a0 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
340b0 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
340c0 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
340d0 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
340e0 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
340f0 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
34100 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
34110 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
34120 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
34130 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
34140 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
34150 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
34160 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
34170 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
34180 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
34190 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 20  mapOk = (pgno>1 
341a0 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61 67  && USEFETCH(pPag
341b0 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  er).   && (pPage
341c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
341d0 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
341e0 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
341f0 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20  ADONLY)).#ifdef 
34200 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
34210 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78  .   && pPager->x
34220 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a  Codec==0.#endif.
34230 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d    );..  /* Optim
34240 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41  ization note:  A
34250 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c  dding the "pgno<
34260 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65 20  =1" term before 
34270 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20  "pgno==0" here. 
34280 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 63   ** allows the c
34290 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65  ompiler optimize
342a0 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 72  r to reuse the r
342b0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22 70  esults of the "p
342c0 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74  gno>1".  ** test
342d0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
342e0 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20   statement, and 
342f0 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70 67  avoid testing pg
34300 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a  no==0 in the.  *
34310 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  * common case wh
34320 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ere pgno is larg
34330 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  e. */.  if( pgno
34340 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29  <=1 && pgno==0 )
34350 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
34360 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
34370 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
34380 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
34390 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
343a0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
343b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
343c0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
343d0 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c  ( noContent==0 |
343e0 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a  | bMmapOk==0 );.
343f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34400 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
34410 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  Lock==1 );..  /*
34420 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
34430 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
34440 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ate, return an e
34450 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  rror immediately
34460 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
34470 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70  e, request the p
34480 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61  age from the PCa
34490 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20  che layer. */.  
344a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
344b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
344c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
344d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
344e0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d  lse{.    if( bMm
344f0 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65  apOk && pagerUse
34500 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
34510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34520 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
34530 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
34540 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
34550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34560 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
34570 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34580 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d    }..    if( bMm
34590 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d  apOk && iFrame==
345a0 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  0 ){.      void 
345b0 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20  *pData = 0;..   
345c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
345d0 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  sFetch(pPager->f
345e0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69  d, .          (i
345f0 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
34600 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
34610 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34620 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29  , &pData.      )
34630 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
34640 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
34650 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ata ){.        i
34660 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
34670 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  e>PAGER_READER |
34680 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
34690 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
346a0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
346b0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
346c0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
346d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
346e0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
346f0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
34700 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
34710 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
34720 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  &pPg);.        }
34730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34740 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
34750 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
34760 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
34770 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
34780 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta);.        }. 
34790 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29         if( pPg )
347a0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
347b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
347c0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  K );.          *
347d0 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
347e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
347f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
34800 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
34830 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34840 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34850 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20     }..    {.    
34860 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65    sqlite3_pcache
34870 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20 20  _page *pBase;.  
34880 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69      pBase = sqli
34890 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
348a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
348b0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
348c0 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
348d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
348e0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53  ite3PcacheFetchS
348f0 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50  tress(pPager->pP
34900 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42  Cache, pgno, &pB
34910 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ase);.        if
34920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34930 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34940 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34950 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34960 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20  {.          pPg 
34970 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20  = *ppPage = 0;. 
34980 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
34990 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
349a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
349b0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
349c0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
349d0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d     }.      pPg =
349e0 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
349f0 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
34a00 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
34a10 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
34a20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34a30 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20 7d   pPg!=0 );.    }
34a40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
34a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34a60 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
34a70 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
34a80 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
34a90 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
34aa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
34ab0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
34ac0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
34ad0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
34ae0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
34af0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
34b00 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
34b10 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
34b20 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
34b30 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
34b40 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34b50 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
34b60 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29  ( pPg==(*ppPage)
34b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34b80 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  g->pgno==pgno );
34b90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
34ba0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
34bb0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  | pPg->pPager==0
34bc0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e   );..  if( pPg->
34bd0 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
34be0 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
34bf0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
34c00 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
34c10 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
34c20 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
34c30 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
34c40 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
34c50 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
34c60 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
34c70 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
34c80 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
34c90 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34ca0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
34cb0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
34cc0 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
34cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
34ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
34cf0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
34d00 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
34d10 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
34d20 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
34d30 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
34d40 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67  ed.  */..    pPg
34d50 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
34d60 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
34d70 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
34d80 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
34d90 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34da0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
34db0 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
34dc0 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
34dd0 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
34de0 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
34df0 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
34e00 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
34e10 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
34e20 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34e30 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
34e40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34e50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
34e60 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34e70 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
34e80 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
34e90 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
34ea0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 69 66  !MEMDB );.    if
34eb0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
34ec0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
34ed0 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
34ee0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34ef0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
34f00 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
34f10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34f20 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
34f30 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34f40 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34f50 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
34f60 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
34f70 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
34f80 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
34f90 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
34fa0 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
34fb0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
34fc0 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
34fd0 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
34fe0 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
34ff0 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
35000 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
35010 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
35020 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
35030 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
35040 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
35050 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
35060 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
35070 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
35080 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
35090 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
350a0 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
350b0 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
350c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
350d0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
350e0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
350f0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
35100 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
35110 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
35120 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
35130 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
35140 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
35150 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
35160 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
35170 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
35180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
35190 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
351a0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
351b0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
351c0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
351d0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
351e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
351f0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
35200 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
35210 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
35220 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
35230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35240 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
35250 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
35260 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
35270 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35280 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
35290 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62  Wal(pPager) && b
352a0 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  MmapOk==0 ){.   
352b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
352c0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
352d0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
352e0 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
352f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35300 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
35310 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
35330 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
35340 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
35350 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
35360 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
35370 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
35380 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
35390 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
353a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
353b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
353c0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
353d0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
353e0 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
353f0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
35400 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
35410 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
35420 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
35430 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
35440 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
35450 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
35460 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
35470 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
35480 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
35490 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
354a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
354b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
354c0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
354d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
354e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
354f0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
35500 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
35510 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
35520 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
35530 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
35540 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
35550 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
35560 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
35570 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
35580 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
35590 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
355a0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
355b0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
355c0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
355d0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
355e0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
355f0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
35600 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
35610 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
35620 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
35630 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
35640 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
35650 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
35660 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
35670 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
35680 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
35690 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
356a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
356b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c  gno pgno){.  sql
356c0 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
356d0 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
356e0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
356f0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
35700 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
35710 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
35720 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73  0 );.  pPage = s
35730 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35740 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
35750 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61  e, pgno, 0);.  a
35760 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20  ssert( pPage==0 
35770 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  || pPager->hasHe
35780 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a  ldSharedLock );.
35790 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29    if( pPage==0 )
357a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
357b0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
357c0 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
357d0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
357e0 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  no, pPage);.}../
357f0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
35800 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
35810 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
35820 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
35830 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
35840 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
35850 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
35860 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
35870 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
35880 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
35890 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
358a0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
358b0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
358c0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
358d0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
358e0 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
358f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35900 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a  NotNull(DbPage *
35910 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
35920 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
35930 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61   pPg!=0 );.  pPa
35940 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
35950 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  r;.  if( pPg->fl
35960 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
35970 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c   ){.    pagerRel
35980 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29  easeMapPage(pPg)
35990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
359a0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
359b0 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
359c0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
359d0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76  sed(pPager);.}.v
359e0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
359f0 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
35a00 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20  g){.  if( pPg ) 
35a10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35a20 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d  fNotNull(pPg);.}
35a30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
35a40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
35a50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
35a60 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
35a70 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
35a80 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
35a90 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
35aa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
35ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
35ac0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
35ad0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
35ae0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
35af0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35b00 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
35b10 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
35b20 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
35b30 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
35b40 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
35b50 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
35b60 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
35b70 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
35b80 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
35b90 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
35ba0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
35bb0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
35bc0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
35bd0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
35be0 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
35bf0 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
35c00 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
35c10 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
35c20 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
35c30 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
35c40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
35c50 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
35c60 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
35c70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
35c80 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
35c90 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
35ca0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
35cb0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
35cc0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
35cd0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
35ce0 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
35cf0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
35d00 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
35d10 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
35d20 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
35d30 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
35d40 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
35d50 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
35d60 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
35d70 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
35d80 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
35d90 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
35da0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
35db0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
35dc0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
35dd0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
35de0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
35df0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
35e00 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
35e10 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
35e20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
35e30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
35e40 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
35e50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
35e60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35e70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
35e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35e90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
35ea0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
35eb0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
35ec0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
35ed0 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
35ee0 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
35ef0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35f00 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35f10 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
35f20 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35f30 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35f50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35f60 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
35f70 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
35f80 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
35f90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
35fa0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
35fb0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
35fc0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
35fd0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
35fe0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
35ff0 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
36000 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
36010 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
36020 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
36030 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
36040 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
36050 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
36060 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
36070 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
36080 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
36090 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
360a0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
360b0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
360c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
360d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
360e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
360f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
36100 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
36110 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
36120 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
36130 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
36140 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
36150 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
36160 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
36170 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
36180 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
36190 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
361a0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
361b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
361c0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
361d0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
361e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
361f0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51    int flags = SQ
36200 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
36210 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
36220 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20  CREATE;.        
36230 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20  int nSpill;..   
36240 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36250 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
36260 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
36270 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
36280 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
36290 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
362a0 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  NAL);.          
362b0 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33  nSpill = sqlite3
362c0 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c  Config.nStmtSpil
362d0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
362e0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
362f0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
36300 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
36310 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20           nSpill 
36320 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  = jrnlBufferSize
36330 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
36340 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20    }.          . 
36350 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
36360 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
36370 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65  se still has the
36380 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74   same name as it
36390 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20   did when.      
363a0 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67    ** it was orig
363b0 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a  inally opened. *
363c0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64  /.        rc = d
363d0 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
363e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
363f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
36410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
36420 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20  rnalOpen (.     
36430 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
36440 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
36450 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
36460 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20  ags, nSpill.    
36470 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
36480 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
36490 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
364a0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
364b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
364c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
364d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
364e0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
364f0 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
36500 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
36510 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
36520 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
36530 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
36540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
36560 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
36570 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
36580 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
36590 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
365a0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
365b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
365c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
365d0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
365e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
365f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
36600 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
36610 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
36620 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
36630 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
36640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
36650 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
36660 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
36670 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
36680 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
36690 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
366a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
366b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
366c0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
366d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
366e0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
366f0 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
36700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36710 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
36720 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
36730 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
36740 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
36750 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
36760 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
36770 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
36780 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
36790 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
367a0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
367b0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
367c0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
367d0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
367e0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
367f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36800 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
36810 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
36820 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
36830 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
36840 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
36850 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
36860 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
36870 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
36880 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
36890 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
368a0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
368b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
368c0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
368d0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
368e0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
368f0 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
36900 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
36910 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
36920 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
36930 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36940 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
36950 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
36960 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
36970 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
36980 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
36990 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
369a0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
369b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
369c0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
369d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
369e0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
369f0 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
36a00 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
36a10 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
36a20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
36a30 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
36a40 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
36a50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
36a60 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
36a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
36a80 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
36a90 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
36aa0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
36ab0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36ac0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
36ad0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
36ae0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
36af0 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
36b00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36b10 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
36b20 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
36b30 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
36b40 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
36b50 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
36b60 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
36b70 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
36b80 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36b90 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
36ba0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
36bb0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
36bc0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
36bd0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
36be0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
36bf0 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
36c00 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
36c10 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
36c20 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
36c30 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
36c40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36c50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36c60 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
36c70 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
36c80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
36c90 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
36ca0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
36cb0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
36cc0 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
36cd0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36ce0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
36cf0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
36d00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36d20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
36d30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36d40 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
36d50 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
36d60 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
36d70 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
36d80 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
36d90 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
36da0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
36db0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
36dc0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
36dd0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
36de0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
36df0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
36e00 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
36e10 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
36e20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
36e30 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
36e40 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
36e50 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
36e60 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
36e70 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
36e80 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
36e90 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
36ea0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
36eb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
36ec0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
36ed0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
36ee0 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
36ef0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
36f00 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
36f10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36f20 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
36f30 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
36f40 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
36f50 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
36f60 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
36f70 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
36f80 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
36f90 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
36fa0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
36fb0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
36fc0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
36fd0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
36fe0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
36ff0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
37000 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
37010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
37020 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
37030 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
37040 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
37050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
37060 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
37070 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
37080 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
37090 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
370a0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
370b0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
370c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
370d0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
370e0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
370f0 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
37100 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
37110 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
37120 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
37130 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
37140 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
37150 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
37160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
37170 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
37180 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
37190 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
371a0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
371b0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
371c0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
371d0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
371e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
371f0 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
37200 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
37210 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
37220 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
37230 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
37240 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
37250 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
37260 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
37270 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
37280 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37290 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
372a0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
372b0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
372c0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
372d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
372e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
372f0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
37300 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
37310 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
37320 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
37330 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
37340 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37350 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
37360 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
37370 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
37380 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37390 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
373a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
373b0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
373c0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
373d0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
373e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
373f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37400 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
37410 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
37420 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
37430 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
37440 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37450 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61  ../*.** Write pa
37460 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20  ge pPg onto the 
37470 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  end of the rollb
37480 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
37490 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
374a0 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
374b0 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63  AddPageToRollbac
374c0 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  kJournal(PgHdr *
374d0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
374e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
374f0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
37500 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68   u32 cksum;.  ch
37510 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36  ar *pData2;.  i6
37520 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
37530 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
37540 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
37550 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
37560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
37570 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20   page that.  ** 
37580 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
37590 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
375a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
375b0 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a  rt verifies.  **
375c0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
375d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
375e0 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
375f0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
37600 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
37610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
37620 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
37630 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28  Off );.  CODEC2(
37640 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
37650 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
37660 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
37670 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
37680 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70  a2);.  cksum = p
37690 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
376a0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
376b0 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61  ..  /* Even if a
376c0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
376d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
376e0 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
376f0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
37700 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
37710 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
37720 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
37730 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65   page..  ** Othe
37740 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
37750 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
37760 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
37770 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c  logic in.  ** pl
37780 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
37790 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
377a0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
377b0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
377c0 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
377d0 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
377e0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
377f0 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
37800 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63   so,.  ** then c
37810 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
37820 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  llow..  */.  pPg
37830 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
37840 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72  _NEED_SYNC;..  r
37850 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
37860 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
37870 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
37880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37890 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
378a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
378b0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
378c0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
378d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
378e0 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
378f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37900 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72  rn rc;.  rc = wr
37910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
37920 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
37930 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
37940 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
37950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37960 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52  turn rc;..  IOTR
37970 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
37980 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
37990 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
379a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
379b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
379c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
379d0 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  ));.  PAGER_INCR
379e0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
379f0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
37a00 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
37a10 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
37a20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
37a30 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
37a40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
37a50 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
37a60 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
37a70 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
37a80 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
37a90 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
37aa0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
37ab0 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
37ac0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
37ad0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
37ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37af0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
37b00 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
37b10 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
37b20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
37b30 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74   pPg->pgno);.  t
37b40 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
37b50 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61  ITE_NOMEM );.  a
37b60 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37b70 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
37b80 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63  TE_NOMEM );.  rc
37b90 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
37ba0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
37bb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37bc0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37bd0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
37be0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
37bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37c00 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
37c10 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
37c20 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
37c30 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
37c40 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
37c50 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
37c60 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
37c70 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
37c80 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
37c90 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
37ca0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
37cb0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
37cc0 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
37cd0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
37ce0 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
37cf0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
37d00 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
37d10 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
37d20 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
37d30 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
37d40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
37d50 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
37d60 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
37d70 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
37d80 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
37d90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54  LITE_OK;..  /* T
37da0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
37db0 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
37dc0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
37dd0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37de0 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
37df0 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
37e00 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
37e10 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
37e20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
37e30 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
37e40 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
37e50 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
37e60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37e70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37e80 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
37e90 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37ea0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37eb0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
37ec0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37ed0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37ee0 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
37ef0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37f00 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37f10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
37f20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
37f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
37f40 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d  Pager->readOnly=
37f50 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41  =0 );.  CHECK_PA
37f60 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
37f70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37f80 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
37f90 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
37fa0 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
37fb0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
37fc0 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
37fd0 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
37fe0 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
37ff0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
38000 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
38010 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
38020 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
38030 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
38040 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
38050 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
38060 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
38070 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
38080 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
38090 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
380a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
380b0 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
380c0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
380d0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
380e0 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
380f0 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
38100 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
38110 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
38120 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
38130 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
38140 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
38150 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
38160 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
38170 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
38180 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
38190 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
381a0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
381b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
381c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
381d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
381e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
381f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
38200 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
38210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
38220 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
38230 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
38240 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
38250 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f  that is about to
38260 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
38270 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69  dirty. */.  sqli
38280 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
38290 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  ty(pPg);..  /* I
382a0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  f a rollback jou
382b0 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20  rnal is in use, 
382c0 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74  them make sure t
382d0 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
382e0 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68  about.  ** to ch
382f0 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20 72  ange is in the r
38300 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
38310 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 20   or if the page 
38320 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66  is a new page of
38330 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20  f.  ** then end 
38340 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b  of the file, mak
38350 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61 72  e sure it is mar
38360 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45  ked as PGHDR_NEE
38370 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61  D_SYNC..  */.  a
38380 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
38390 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d  pInJournal!=0) =
383a0 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
383b0 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
383c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
383d0 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74  l!=0.   && sqlit
383e0 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
383f0 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ull(pPager->pInJ
38400 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
38410 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61  o)==0.  ){.    a
38420 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
38430 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
38440 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
38450 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
38460 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
38470 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61 67  rc = pagerAddPag
38480 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e  eToRollbackJourn
38490 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  al(pPg);.      i
384a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
384b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
384c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
384d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
384e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
384f0 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
38500 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
38510 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
38520 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
38530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
38540 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
38550 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
38560 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
38570 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
38580 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
38590 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
385a0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
385b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
385c0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d  C)?1:0)));.    }
385d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
385e0 47 48 44 52 5f 44 49 52 54 59 20 62 69 74 20 69  GHDR_DIRTY bit i
385f0 73 20 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e  s set above when
38600 20 74 68 65 20 70 61 67 65 20 77 61 73 20 61 64   the page was ad
38610 64 65 64 20 74 6f 20 74 68 65 20 64 69 72 74 79  ded to the dirty
38620 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62  -list.  ** and b
38630 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68  efore writing th
38640 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
38650 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
38660 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f  .  Wait until no
38670 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68  w,.  ** after th
38680 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
38690 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75  successfully jou
386a0 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20  rnalled, before 
386b0 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  setting the.  **
386c0 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45   PGHDR_WRITEABLE
386d0 20 62 69 74 20 74 68 61 74 20 69 6e 64 69 63 61   bit that indica
386e0 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  tes that the pag
386f0 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  e can be safely 
38700 6d 6f 64 69 6